КПД. Это простая обертка для библиотеки PDO PHP, совместимой с SQL Server (2008 R2 или выше), MySQL (5,7 или выше) и Oracle (12,1 или выше).
Эта библиотека пытается работать как можно быстрее . Большинство операций являются простыми управлением струнными/массивами и работают в обнаженном металле библиотеки PDO, но также позволяет создавать ORM, используя Extension Eftec/PDOOeRorm.
Поверните это
$ stmt = $ pdo -> prepare ( " SELECT * FROM myTable WHERE name = ? " );
$ stmt -> bindParam ( 1 , $ _POST [ ' name ' ], PDO :: PARAM_STR );
$ stmt -> execute ();
$ result = $ stmt -> get_result ();
$ products =[];
while ( $ row = $ result -> fetch_assoc ()) {
$ product []= $ row ;
}
$ stmt -> close ();в это
$ products = $ pdoOne
-> select ( " * " )
-> from ( " myTable " )
-> where ( " name = ? " ,[ $ _POST [ ' name ' ]])
-> toList ();или используя ORM (с помощью библиотеки EFTEC/PDOOEROMER)
ProductRepo // this class was generated with echo $pdoOne()->generateCodeClass(['Product']); or using the cli.
:: where ( " name = ? " ,[ $ _POST [ ' name ' ]])
:: toList ();| Примечание | Пример кексов | Пример поиска | Пример другой метод |
|---|---|---|---|
![]() | ![]() | ![]() |
Больше примеров:
Пример MySQL PHP и PDO с использованием PDOONE
Эта библиотека требует PHP 7.1 и выше, и для этого требуется расширение PDO и расширение PDO-MySQL (MYSQL), PDO-SQLSRV (SQL Server) или PDO-OCI (ORACLE)
Редактировать Composer.json следующее требование, затем обновите Composer.
{
"require" : {
"eftec/PdoOne" : " ^4.0.1 "
}
}или установите его через CLI, используя
Композитор требует eftec/pdoone
Просто загрузите папку LIB из библиотеки и поместите свой папковый проект. Затем вы должны включить все включенные файлы.
Создайте экземпляр класса PDOONE следующим образом. Затем вы можете открыть соединение, используя метод connect () или open ()
use eftec PdoOne ;
// mysql
$ dao = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// sql server 10.0.0.1instance or (local)instance or machinenameinstance or machine (default instance)
$ dao = new PdoOne ( " sqlsrv " , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// test (mockup)
$ dao = new PdoOne ( " test " , " anyy " , " any " , " any " , " any " , "" );
$ dao -> connect ();
// oci (oracle) ez-connect. Remember that you must have installed Oracle Instant client and added to the path.
$ cs = ' (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = instancia1))) ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// oci (oracle) tsnnames (the environment variables TNS_ADMIN and PATH must be correctly configured), also tnsnames.ora must exists.
$ cs = ' instancia1 ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();где
$ dao = new PDOONE ("MySQL", "127.0.0.1", "root", "abc.123", "sakila", "");
Oracle сложно установить. В Windows, из папки Bin Home Oracle, вы должны скопировать все DLL в папку PHP и папку Apache.
С помощью метода runrawquery () мы могли бы выполнить команду непосредственно в PDO с или без параметров. И это может вернуть pdostatement или массив . Это полезно, когда мы хотим скорость.
Runrawquery ($ rawsql, $ param, $ returnarray, $ fetchmode, $ fetchargument)
String $ rawsql Запрос для выполнения массива | null $ param [type1, value1, type2, value2] или [name1 => value, name2 = value2] bool $ returnArray, если истина (по умолчанию), то он возвращает массив. Если false, то он возвращает pdostatement int $ fetchmode, указывает режим для извлечения. Пример: pdo :: fetch_assoc null $ fetchargument Аргумент FetchMode.
$ sql = ' select * from table where id=1 ' ;
$ pdoStatement = $ pdoOne -> runRawQuery ( $ sql ,[], false ); // [] are the parametersНо мы могли бы изменить его, чтобы вернуть массив
$ sql = ' select * from table where id=1 ' ;
$ values = $ pdoOne -> runRawQuery ( $ sql ); // [] are the parametersМы также могли бы пройти параметры.
$ values = $ con -> runRawQuery ( ' select * from table where id=? ' ,[ 20 ]); // with parameter
$ values = $ con -> runRawQuery ( ' select * from table where id=:name ' ,[ ' name ' => 20 ]); // with named parameter
$ values = $ con -> runRawQuery ( ' select * from table ' ,[]); // without parameter.Обратите внимание, что эта библиотека использует подготовленные операторы, поэтому она свободна от инъекции SQL (если вы используете параметры)
$ name = " O'hara " ;
$ values = $ con -> runRawQuery ( " select * from table where name=:name " ,[ ' name ' => $ name ]); // it works.✅
$ values = $ con -> runRawQuery ( " select * from table where name=? " ,[ $ name ]); // it works ok.✅
$ values = $ con -> runRawQuery ( " select * from table where name=' $ name ' " ); // it will crash.С помощью метода RunQuery () мы могли бы выполнить подготовленный оператор в PDO. Это полезно, когда мы хотим передать аргументы в это. RunQuery () требует PDO PreditStatement .
Этот метод не рекомендуется, если вы уже не работаете с операторами PDO, и вы не хотите адаптировать весь свой код.
$ sql = " insert into `product`(name) values(?) " ;
$ stmt = $ pdoOne -> prepare ( $ sql );
$ productName = " Cocacola " ;
$ stmt -> bind_param ( " s " , $ productName ); // s stand for a string. Also i =integer, d = double and b=blob
$ rows = $ pdoOne -> runQuery ( $ stmt );
$ allRows = $ rows -> fetch_all ( PDO :: FETCH_ASSOC );Вы можете использовать строитель запросов для создания своей команды. Вы можете проверить главу о Builder (DQL) для получения дополнительной информации.
// query builder
$ pdoOne -> set ([ ' name ' => ' cocacola ' ])
-> from ( ' product ' )
-> insert ();Библиотека eftec pdoomemplom позволяет создавать [ORM] (#ORM) ваших таблиц. Если вы создали ORM, то вы можете использовать следующий код
ProductRepo:: toList ([ ' category ' => ' drink ' ]);Где производительность - это сервисный класс, сгенерированный с помощью ORM.
По умолчанию PDOONE выполняет запросы в режиме PDO :: FETCH_ASSOC Вы можете изменить, запустив запросы как:
$ pdo -> setFechMode ( PDO :: FETCH_CLASS , ' stdClass ' )-> runRawQuery ( $ query );
// or you can run as
$ pdo -> runRawQuery ( $ query , null , true , false , null , PDO :: FETCH_CLASS , ' stdClass ' )PDOONE позволяет 5 типов дат.
SQL Format Это формат, как дата хранится в базе данных. Это зависит от типа базы данных. Например, MySQL может использовать формат YMD.
Человеческий формат Это формат, как конечный пользователь выглядит наша дата.
Формат даты ISO . Это формат, как значение можно транспортировать и сериализовать.
TimeStamp : она имеет значение количество секунд после 1-1-1970
Класс / PHP класс : это объект DateTime .
Есть 3 метода для выполнения транзакции:
| Метод | Описание |
|---|---|
| StartTransaction () | Это начинает транзакцию. В зависимости от базы данных типа, она может быть сложена или нет. |
| совершить() | Совершать (и закрывать) транзакцию |
| Rollback () | Откат (и закрывает) транзакция |
Пример:
try {
$ sql = " insert into `product`(name) values(?) " ;
$ pdoOne -> startTransaction ();
$ result = $ pdoOne -> runRawQuery ( $ sql ,[ ' Fanta ' => $ productName ], false );
$ pdoOne -> commit (); // transaction ok
} catch ( Exception $ e ) {
$ pdoOne -> rollback ( false ); // error, transaction cancelled, the false means that it doesn't throw an exception if we want rollback.
}Возвращает true, если таблица существует (текущая база данных/схема)
Возвращает статистику (в качестве массива) столбца таблицы.
$ stats = $ pdoOne -> statValue ( ' actor ' , ' actor_id ' );| мин | максимум | ав | сумма | считать |
|---|---|---|---|---|
| 1 | 205 | 103.0000 | 21115 | 205 |
Возвращает все столбцы таблицы
$ result = $ pdoOne -> columnTable ( ' actor ' );| Колноме | Колтип | colsize | Colpres | Colscale | Iskey | Isidentity |
|---|---|---|---|---|---|---|
| actor_id | Smallint | 5 | 0 | 1 | 1 | |
| имя | варчар | 45 | 0 | 0 | ||
| фамилия | варчар | 45 | 0 | 0 | ||
| last_update | временная метка | 0 | 0 |
Возвращает все иностранные ключи таблицы (исходная таблица)
Создает таблицу, используя определение и первичный ключ.
ПРИМЕЧАНИЕ. Вы можете сгенерировать код для создания таблицы, используя существующую таблицу, выполнив CLI (вывод ClassCode)
php pdoone.php -database mysql -server 127.0.0.1 -pwd abc.123 -db sakila -Input пленка -тайт Classcode
Пример: (MySQL)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
],[
" film_id " => " PRIMARY KEY " ,
" title " => " KEY " ,
" language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE " ,
" original_language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE "
]); $ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
], ' film_id ' ); Пример (SQLSRV)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " int NOT NULL IDENTITY(1,1) " ,
" title " => " varchar(255) NOT NULL " ,
" description " => " text(2147483647) DEFAULT (NULL) " ,
" release_year " => " varchar(4) " ,
" language_id " => " tinyint NOT NULL " ,
" original_language_id " => " tinyint DEFAULT (NULL) " ,
" rental_duration " => " tinyint NOT NULL DEFAULT ((3)) " ,
" rental_rate " => " decimal(4,2) NOT NULL DEFAULT ((4.99)) " ,
" length " => " smallint DEFAULT (NULL) " ,
" replacement_cost " => " decimal(5,2) NOT NULL DEFAULT ((19.99)) " ,
" rating " => " varchar(10) DEFAULT ('G') " ,
" special_features " => " varchar(255) DEFAULT (NULL) " ,
" last_update " => " datetime NOT NULL DEFAULT (getdate()) "
],[
" language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" original_language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" film_id " => " PRIMARY KEY "
]);Он возвращает список таблиц, упорядоченных по зависимости (от отсутствия зависимости до более зависимых)
Примечание : эта операция не является надежной, потому что таблицы могут иметь круглые ссылки.
$ dao = new PdoOne ( ' sqlsrv ' , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " );
$ dao -> open ();
echo " <pre> " ;
var_dump ( $ dao -> tableSorted ( 3 , false , true )); // it returns the tables sortered
var_dump ( $ dao -> tableSorted ( 3 , true , true )); // it returns all the tables that can't be sortered
echo " </pre> " ;Он проверяет таблицу, если таблица соответствует определению, подходящему по значениям.
$def=[
"film_id" => "int NOT NULL IDENTITY(1,1)",
"title" => "varchar(255) NOT NULL",
"description" => "text(2147483647) DEFAULT (NULL)",
"release_year" => "varchar(4)",
"language_id" => "tinyint NOT NULL",
"original_language_id" => "tinyint DEFAULT (NULL)",
"rental_duration" => "tinyint NOT NULL DEFAULT ((3))",
"rental_rate" => "decimal(4,2) NOT NULL DEFAULT ((4.99))",
"length" => "smallint DEFAULT (NULL)",
"replacement_cost" => "decimal(5,2) NOT NULL DEFAULT ((19.99))",
"rating" => "varchar(10) DEFAULT ('G')",
"special_features" => "varchar(255) DEFAULT (NULL)",
"last_update" => "datetime NOT NULL DEFAULT (getdate())"
];
$keys=[
"language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"original_language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"film_id" => "PRIMARY KEY"
];
var_dump(PdoOne::validateDefTable(self::getPdoOne(),self::TABLE,$def,$keys));
Возвращает все иностранные ключи таблицы.
$ result = $ pdoOne -> foreignKeyTable ( ' actor ' );| коллокал | табличка | Коллем |
|---|---|---|
| customer_id | клиент | customer_id |
| rent_id | прокат | rent_id |
| персонал_ид | персонал | персонал_ид |
Вы также можете построить процедурный запрос.
Пример:
$ results = $ pdoOne -> select ( " * " )-> from ( " producttype " )
-> where ( ' name=? ' , [ ' Cocacola ' ])
-> where ( ' idproducttype=? ' , [ 1 ])
-> toList (); Указывает столбцы для возврата. Аргумент представляет собой команду SQL, поэтому он позволяет любой операции, которую поддержка базы данных, включая функции, константы, операторы, псевдоним и тому подобное.
$ results = $ pdoOne -> select ( " col1,col2 " ); //...Генерирует запрос: выберите COL1, COL2 ....
$ results = $ pdoOne -> select ( " select * from table " ); //->...Генерирует запрос: выберите * из таблицы ....
Генерирует запрос, который возвращает количество значений. Это макрос метода Select ()
$ result = $ pdoOne -> count ( ' from table where condition=1 ' ); // select count(*) from table where c..
$ result = $ pdoOne -> count ()-> from ( ' table ' )-> where ( ' condition=? ' ,[ 1 ]); // select count(*) from table where c..
$ result = $ pdoOne -> count ( ' from table ' , ' col1 ' ); // select count(col1) from table
$ result = $ pdoOne -> count ()-> from ( ' table ' ); // select count(*) from tableГенерирует запрос, который возвращает минимальное значение столбца. Если $ arg пуст, то он использует $ sql для имени столбца, это макрос метода Select ()
$ result = $ pdoOne -> min ( ' from table where condition=1 ' , ' col ' ); // select min(col) from table where c..
$ result = $ pdoOne -> min ( ' from table ' , ' col1 ' ); // select min(col1) from table
$ result = $ pdoOne -> min ( '' , ' col1 ' )-> from ( ' table ' ); // select min(col1) from table
$ result = $ pdoOne -> min ( ' col1 ' )-> from ( ' table ' ); // select min(col1) from tableГенерирует запрос, который возвращает максимальное значение столбца. Если $ arg пуст, то он использует $ sql для имени столбца, это макрос метода Select ()
$ result = $ pdoOne -> max ( ' from table where condition=1 ' , ' col ' ); // select max(col) from table where c..
$ result = $ pdoOne -> max ( ' from table ' , ' col1 ' ); // select max(col1) from tableГенерирует запрос, который возвращает значение суммы столбца. Если $ arg пуст, то он использует $ sql для имени столбца, это макрос метода Select ()
$ result = $ pdoOne -> sum ( ' from table where condition=1 ' , ' col ' ); // select sum(col) from table where c..
$ result = $ pdoOne -> sum ( ' from table ' , ' col1 ' ); // select sum(col1) from tableГенерирует запрос, который возвращает среднее значение столбца. Если $ arg пуст, то он использует $ sql для имени столбца, это макрос метода Select ()
$ result = $ pdoOne -> avg ( ' from table where condition=1 ' , ' col ' ); // select avg(col) from table where c..
$ result = $ pdoOne -> avg ( ' from table ' , ' col1 ' ); // select avg(col1) from tableГенерирует команду SELECT.
$ results = $ pdoOne -> select ( " col1,col2 " )-> distinct (); //...Генерирует запрос: выберите различные col1, col2 ....
ПРИМЕЧАНИЕ: -> inform ('уникальный') возвращает выберите уникальный ..
Генерирует команду SQL.
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' ); //...Генерирует запрос: выберите * из таблицы
$ Таблицы могут быть единственной таблицей или конструкцией SQL. Для examp, следующая команда действительна:
$ results = $ pdoOne -> select ( " * " )-> from ( ' table t1 inner join t2 on t1.c1=t2.c2 ' ); //...Генерирует команду, где.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=1 ' ); //...Где можно выразить по -разному.
Можно написать где без параметров следующим образом:
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=1 and p2>2.5 or p3 like '%aa%' " ); $ aa = ' aa ' ;
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=? and p2>? or p3 like ? " ,[ 1
, 2.5
, " % $ aa % " ]);Это также работает
// (if there is only a single argument without a type)
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=? " ,[ 1 ]); // = where("p1=?",[1]);
// (if we don't define to where to put the value)
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1 " ,[ 1 ]); // = where("p1=?",[1]); Это сокращенное определение запроса с использованием ассоциативного массива, где ключ - это имя столбца, а значение - значение для сравнения
Он работает только с равенством (=) и логическим оператором 'и' (тип определяется автоматически)
// select * from table where p1='1' and p2='2.5' and p3='aa'
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ([ ' p1 ' => 1
, ' p2 ' => 2.5
, ' p3 ' => ' aa ' ]); Кроме того, можно указать тип параметра.
// select * from table where p1=1 and p2='2.5' and p3='aa'
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ([ ' p1 ' =>[ 1 ]
, ' p2 ' =>[ 2.5 ]
, ' p3 ' =>[ ' aa ' ]]); Вы также можете использовать ассоциативный массив в качестве аргумента и названные параметры в запросе
$ results = $ pdoOne -> select ( " * " )-> from ( " table " )
-> where ( ' condition=:p1 and condition2=:p2 ' ,[ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();Генерирует запрос: выберите * из таблицы , где условие =? (Coca-Cola) и условия2 =? (1)
Генерирует запрос: выберите * из таблицы , где P1 = 1
ПРИМЕЧАНИЕ. ArrayParameters - это массив следующим образом: тип, значение.
Где тип i = целое число, d = двойное, s = строка или b = blob. В случае сомнения, используйте «S» (см. Таблицу ниже)
Пример ArrayParameters:
[1, «Привет», 20,3, «мир»]
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ 1 ]); //...Генерирует запрос: выберите * из таблицы , где P1 =? (1)
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? and p2=? ' ,[ 1 , ' hello ' ]); //...Генерирует запрос: выберите * из таблицы , где P1 =? (1) и P2 =? ('Hello')
Примечание. где можно вложить.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ 1 ])
-> where ( ' p2=? ' ,[ ' hello ' ]); //...Генерирует запрос: выберите * из таблицы , где P1 =? (1) и P2 =? ('Hello')
Вы также можете использовать:
$ results = $ pdoOne -> select ( " * " )-> from ( " table " )
-> where ([ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();Генерирует запрос: выберите * из таблицы , где P1 =? (Coca-Cola) и P2 =? (1)
Генерирует команду заказа.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> order ( ' p1 desc ' ); //...Генерирует запрос: выберите * Из таблицы порядок по p1 desc
Генерирует групповую команду.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' ); //...Генерирует запрос: выберите * Из таблицы группы по p1
Генерирует имеющуюся команду.
Примечание: он использует те же параметры, что и где ()
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' )
-> having ( ' p1>? ' , array ( 1 )); //...Генерирует запрос: выберите * из группы таблицы от P1 с P1>? (1)
ПРИМЕЧАНИЕ. Имея ()-> Иметь ()
ПРИМЕЧАНИЕ. Имеясь без параметров, имеющих ('col> 10')
Запустите запрос Generate.
ПРИМЕЧАНИЕ Если returnarray верен, то он возвращает ассоциативный массив. Если returnArray неверно, он возвращает mysqli_result
Примечание. Он сбрасывает текущие параметры (например, ток Select, от, где и т. Д.)
Это макрос RunGen () . Он возвращает ассоциативный массив или неверно, если операция не выполняется.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toList (); Он возвращает pdostatement из текущего запроса
Примечание. Если вы хотите зацикнуть оператор, то вы можете использовать fetchloop ()
Пример :
$ stmt = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toPdoStatement ();
while ( $ row = $ stmt -> fetch ()) {
// do something
} Он приносит запрос для каждого ряда.
Этот метод можно использовать, когда мы не хотим читать всю информацию одновременно, чтобы вы могли прочитать и обрабатывать каждую строку отдельно
Пример :
$ this -> select ( ' select id,name from table ' )
-> fetchLoop ( static function ( $ row ) { return ( $ row );}, PDO :: FETCH_ASSOC )Он возвращает метакод (определения) каждого столбца запроса.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toMeta (); или
$ results = $ pdoOne -> toMeta ( ' select * from table ' ); результат:
array(3) {
[0]=>
array(7) {
["native_type"]=>
string(4) "LONG"
["pdo_type"]=>
int(2)
["flags"]=>
array(2) {
[0]=>
string(8) "not_null"
[1]=>
string(11) "primary_key"
}
["table"]=>
string(11) "producttype"
["name"]=>
string(13) "idproducttype"
["len"]=>
int(11)
["precision"]=>
int(0)
}
[1]=>
array(7) {
["native_type"]=>
string(10) "VAR_STRING"
["pdo_type"]=>
int(2)
["flags"]=>
array(0) {
}
["table"]=>
string(11) "producttype"
["name"]=>
string(4) "name"
["len"]=>
int(135)
["precision"]=>
int(0)
}
}
Это макрос Rungen. Он возвращает индексированный массив из первого столбца
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toListSimple (); // ['1','2','3','4'] Он возвращает ассоциативный массив, где первое значение является ключом, а второе - это значение.
Если второе значение не существует, оно использует индекс как значение (первое значение).
$ results = $ pdoOne -> select ( " cod,name " )
-> from ( ' table ' )
-> toListKeyValue (); // ['cod1'=>'name1','cod2'=>'name2'] Это макрос Rungen. Он возвращает mysqli_result или null.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toResult (); // Он возвращает первый скаляр (одно значение) запроса. Если $ colname - это null, то он использует первый столбец.
$ count = $ this -> count ( ' from product_category ' )-> firstScalar ();Это макрос Rungen. Он возвращает первую строку, если таковая имеется, если нет, то он возвращает False, как ассоциативный массив.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> first (); Это макрос Rungen. Он возвращает последнюю строку (если нет, если нет, он возвращает false) в качестве ассоциативного массива.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> last (); Иногда более эффективно запустить Order () и First (), потому что Last () читает все значения.
Он возвращает команду SQL и строку.
$ sql = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> sqlGen ();
echo $ sql ; // returns select * from table
$ results = $ pdoOne -> toList (); // executes the queryПримечание: он не сбрасывает запрос.
Есть четыре способа выполнить каждую команду.
Допустим, мы хотим добавить целое число в столбце COL1 со значением 20
Схема и значения с использованием списка значений : где первое значение - это столбец, второе - тип значения (i = integer, d = double, s = string, b = blob), а второй массив содержит значения.
$ pdoOne -> insert ( " table "
,[ ' col1 ' ]
,[ 20 ]);Схема и значения в том же списке : где первое значение - это столбец, второе - тип значения (i = Integer, D = Double, S = String, B = Blob), а третье - значение.
$ pdoOne -> insert ( " table "
,[ ' col1 ' , 20 ]);Схема и значения с использованием двух ассоциативных массивов :
$ pdoOne -> insert ( " table "
,[ ' col1 ' ]
,[ ' col1 ' => 20 ]);Схема и значения с использованием одного ассоциативного массива : тип рассчитывается автоматически.
$ pdoOne -> insert ( " table "
,[ ' col1 ' => 20 ]);Генерирует команду вставки.
$ pdoOne -> insert ( " producttype "
,[ ' idproducttype ' , ' name ' , ' type ' ]
,[ 1 , ' cocacola ' , 1 ]);Использование вложенной цепи (одиночный массив)
$ pdoOne -> from ( " producttype " )
-> set ([ ' idproducttype ' , 0 , ' name ' , ' Pepsi ' , ' type ' , 1 ])
-> insert ();Использование вложенной цепной множественной набора
$ pdoOne -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ 101 ])
-> set ( ' name=? ' ,[ ' Pepsi ' ])
-> set ( ' type=? ' ,[ 1 ])
-> insert ();или (тип определяется, в возможном, автоматически MySQL)
$ pdoOne -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ 101 ])
-> set ( ' name=? ' , ' Pepsi ' )
-> set ( ' type=? ' , 1 )
-> insert (); $ pdoOne -> insertObject ( ' table ' ,[ ' Id ' => 1 , ' Name ' => ' CocaCola ' ]);Использование вложенного декларативного набора цепи
$ pdoOne -> from ( " producttype " )
-> set ( ' (idproducttype,name,type) values (?,?,?) ' ,[ 100 , ' Pepsi ' , 1 ])
-> insert ();Генерирует запрос: вставьте в производительность (idProductType, имя, тип) значения (?,?,?) ....
Генерирует команду вставки.
$ pdoOne -> update ( " producttype "
,[ ' name ' , ' type ' ] //set
,[ 6 , ' Captain-Crunch ' , 2 ] //set
,[ ' idproducttype ' ] // where
,[ 6 ]); // where $ pdoOne -> update ( " producttype "
,[ ' name ' => ' Captain-Crunch ' , ' type ' => 2 ] // set
,[ ' idproducttype ' => 6 ]); // where $ pdoOne -> from ( " producttype " )
-> set ( " name=? " ,[ ' Captain-Crunch ' ]) //set
-> set ( " type=? " ,[ 6 ]) //set
-> where ( ' idproducttype=? ' ,[ 6 ]) // where
-> update (); // updateили
$ pdoOne -> from ( " producttype " )
-> set ( " name=? " , ' Captain-Crunch ' ) //set
-> set ( " type=? " , 6 ) //set
-> where ( ' idproducttype=? ' ,[ 6 ]) // where
-> update (); // updateГенерирует запрос: обновление ProductType Set
name=?,type=? гдеidproducttype=? ....
Генерирует команду удаления.
$ pdoOne -> delete ( " producttype "
,[ ' idproducttype ' ] // where
,[ 7 ]); // where $ pdoOne -> delete ( " producttype "
,[ ' idproducttype ' => 7 ]); // whereГенерирует запрос: удалить из ProductType, где
idproducttype=? ....
Вы также можете удалить через цепочку Builder DQL.
$ pdoOne -> from ( " producttype " )
-> where ( ' idproducttype=? ' ,[ 7 ]) // where
-> delete (); $ pdoOne -> from ( " producttype " )
-> where ([ ' idproducttype ' => 7 ]) // where
-> delete (); Генерирует запрос: удалить из ProductType, где
idproducttype=? ....
Необязательно кэшировать результат запросов. Продолжительность запроса также определена в запросе. Если результат запроса не кэширован, то он рассчитывается нормально (выполнение запроса в базе данных). Для определения уникального запроса система генерирует уникальный идентификатор (UID), основанный на SHA256, созданный с помощью запроса, параметров, методов и типа работы.
Библиотека не выполняет никакой операции кэша напрямую, вместо этого она позволяет кэшировать результаты, используя внешнюю библиотеку.
class CacheService implements eftec IPdoOneCache {
public $ cacheData =[];
public $ cacheCounter = 0 ; // for debug
public function getCache ( $ uid , $ family = '' ) {
if ( isset ( $ this -> cacheData [ $ uid ])) {
$ this -> cacheCounter ++;
echo " using cache n" ;
return $ this -> cacheData [ $ uid ];
}
return false ;
}
public function setCache ( $ uid , $ family = '' , $ data = null , $ ttl = null ) {
$ this -> cacheData [ $ uid ]= $ data ;
}
public function invalidateCache ( $ uid = '' , $ family = '' ) {
unset( $ this -> cacheData [ $ uid ]);
}
}
$ cache = new CacheService ();(2) Устанавливает службу кеша
$ pdoOne = new PdoOne ( " mysql " , " 127.0.0.1 " , " travis " , "" , " travisdb " );
$ cache = new CacheService ();
$ $ pdoOne -> setCacheService ( $ cache );(3) Используйте кэш следующим образом, мы должны добавить метод usecache () в любую часть запроса.
$ pdoOne -> select ( ' select * from table ' )
-> useCache ()-> toList (); // cache that never expires
$ pdoOne -> select ( ' select * from table ' )
-> useCache ( 1000 )-> toList (); // cache that lasts 1000ms. class CacheService implements eftec IPdoOneCache {
public function getCache ( $ uid , $ family = '' ) {
return apcu_fetch ( $ uid );
}
public function setCache ( $ uid , $ family = '' , $ data = null , $ ttl = null ) {
apcu_store ( $ uid , $ data , $ ttl );
}
public function invalidateCache ( $ uid = '' , $ family = '' ) {
// invalidate cache
apcu_delete ( $ uid );
}
}
$ cache = new CacheService ();Последовательность является альтернативой Auto_numeric (идентификационному) полю. Он имеет два метода для создания последовательности: снежинка и последовательность . Это альтернатива для создания GUID в основном потому, что он возвращает число (GUID обычно - это строка, которая дороже индекс и хранение)
Цель последовательности состоит в том, чтобы создать уникальное число, которое он никогда не повторяется.
$ dao -> nodeId = 1 ; // optional
$ dao -> tableSequence = ' snowflake ' ; // optional
$ dao -> createSequence (); // it creates a table (and it could create a store procedure) called snowflake and a function called next_snowflake(). You could create it only once.Можно создать новую последовательность без какой -либо таблицы. Это быстро, но у него могут быть проблемы с столкновениями.
Это обеспечивает бесплатное количество столкновений, только если мы не делаем более одной операции на 0,0001 секунду, однако, он также добавляет псевдо-случайное число (0-4095 основано во времени), поэтому шансы на столкновение составляют 1/4095 (за две операции, выполняемые каждые 0,0001 секунды). Он основан на номере снежинки в Твиттере. т.е. Вы безопасны для столкновений, если вы делаете менее 1 миллиона операций в секунду (технически: 45 миллионов).
$ pdo-> get sequencephp ([непредсказуемый = false]) возвращает последовательность без использования таблицы. Эта последовательность более эффективна, чем $ dao> Получить последовательность, но она использует случайную ценность для столкновений.
Если подливным является правдой, то он возвращает непредсказуемое число (он переворачивает несколько цифр)
$ pdo -> getSequencePHP () // string(19) "3639032938181434317" $ dao -> getSequencePHP ( true ) // string(19) "1739032938181434311" $ pdo ->getSequence() // string(19) "3639032938181434317"
$ pdo -> getSequencePHP () // string(19) "3639032938181434317" $ pdo -> getSequence ( true ) // returns a sequence by flipping some values.
$ pdo -> getSequencePHP ( true ) // string(19) "1739032938181434311" | Поле | Описание | Пример |
|---|---|---|
| $ prefixbase | Если нам нужно добавить префикс в каждую таблицу | $ this-> prefixbase = 'example_'; |
| $ InternalCacheCounter | Счетчик хитов внутреннего кеша. | $ this-> internalCacheCounter =; |
| $ NODEID | Используется последовательности (снежинка). Узида это идентификатор узла. Это должно быть между 0..1023 | $ this-> nodeid = 3; |
| $ tablesequence | Название последовательности таблицы (снежинка) | $ this-> tablesequence = "tableseq1"; |
| $ masks0 | Если мы хотим генерировать непредсказуемое число (используется последовательно) | $ this-> masks0 = [0,1,2,3,4]; |
| $ masks1 | Если мы хотим генерировать непредсказуемое число (используется последовательно) | $ this-> masks1 = [4,3,2,1,0]; |
| $ DATABASETYPE | Текущий тип базы данных. Он установлен через El Constructor | echo $ this-> databasetype; |
| $ сервер | Текущая серверная машина | Echo $ this-> сервер; |
| $ Пользователь | Текущий пользователь | Echo $ this-> пользователь; |
| $ pwd | Текущий пароль | Echo $ this-> pwd; |
| $ db | Текущая база данных или схема (Oracle игнорирует это значение) | Echo $ this-> db; |
| $ charset | Чтобы установить charset по умолчанию. Он должен быть установлен через конструктор | Echo $ this-> charset; |
| $ isopen | Это правда, если база данных подключена иначе, это ложь | if ($ this-> isopen) {…}; |
| $ troponError | Если true (по умолчанию), то он бросает ошибку, если происходит ошибка. Если неверно, то исполнение продолжается | $ this-> doponerror = false; |
| $ conn1 | Экземпляр PDO. Вы можете установить его или использовать напрямую. | $ this-> conn1-> pdostatement (..); |
| $ transactionopen | Правда, если транзакция открыта | if ($ this-> transactionopen) {…}; |
| $ readonly | Если база данных находится в режиме только чтения или нет. Если это правда, то мы должны избегать записи в базе данных | $ this-> readonly = true; |
| $ logfile | Полное имя файла журнала. Если он пуст, то он не хранит файл журнала. Файл журнала ограничен 1 МБ | $ this-> logfile = "/folder/file.log"; |
| $ errortext | Он хранит последнюю ошибку. Runget и Begintry сбрасывают его | echo $ this-> errortext; |
| $ iSthrow | Тодо | $ this-> iSthrow =; |
| $ loglevel | Это указывает на текущий уровень журнала. 0 = без журнала (для производства), 3 = полный журнал | $ this-> loglevel = 3; |
| $ | Последний запрос выполнен | echo $ this-> fastequery; |
| $ lastparam | Последние параметры. Это ассоциативный массив | echo $ this-> lastparam; |
Эта библиотека разрешает шифрование/дешифрование информации.
Чтобы установить шифрование, вы можете использовать следующую команду:
$ this -> setEncryption ( 12345678 , '' , ' INTEGER ' ); // the type of encryption is integer and it only works with integers. It doesn't use a salt value
$ this -> setEncryption ( ' password ' , ' some-salt ' , ' AES-256-CTR ' ); // the password, the salt and the type of encryption (aes-256-ctr), you can use other methods
$ this -> setEncryption ( ' passwrd ' , '' , ' SIMPLE ' ); // the type of encryption is simple and it only works with primitive values. It doesn't use a salt.Затем вы можете зашифровать и расшифровать значение, используя
$ encrypted = $ this -> encrypt ( $ original ); // encrypt $original
$ original = $ this -> decrypt ( $ encrypted ); // decrypt $encryptedПример:
$ this -> setEncryption ( ' 12345 ' , ' salt-1234 ' ); // it will use AES-256-CTR, the password and the salt must be secret.
// create user
$ this -> set ([ ' username ' => 1 , ' password ' => $ this -> encrypt ( $ password )])
-> from ( ' user ' )
-> insert ();
// validate user
$ user = $ this -> select ([ ' username ' , ' password ' ])
-> from ( ' user ' )
-> where ([ ' username ' , ' password ' ],[ 1 , $ this -> encrypt ( $ password )])
-> first ();
// $user= if false or null then the user does not exist or the password is incorrect. Вы можете установить уровень журнала на 3. Уровень журнала работает, когда операция не выполняется, тем выше уровень журнала, тогда он показывает большую часть информации.
$ pdoOne -> logLevel = 3 ; // the highest for debug.По умолчанию PDOONE бросает ошибки PHP, но мы могли бы избежать этого, установив поле $ throlonError на false.
$ pdoOne -> throwOnError = false ; // it could be used in production. var_dump ( $ pdoOne -> lastQuery ); // it shows the last query
var_dump ( $ pdoOne -> lastParam ); // and it shows the last parameters.Если пуст, то он не будет генерировать файл журнала (с помощью файла журнала PHP)
$ pdoOne -> logFile = true ; У PDOONE есть некоторые функции, доступные только в CLI.

Выполнить следующую строку (в папке LIB)
php pdoonecli.php
(или указывая на правую папку)
php/var/web/vendor/eftec/lib/pdoonecli
Вы можете использовать флаг «-i», чтобы войти в интерактивный режим.
Вы можете использовать клавишу TAB для автозаполнения значений (если есть).

Примечание. Вы также можете сохранить и загрузить конфигурацию.
Подключитесь к MySQL и генерируйте CSV из таблицы «актер»
# # via arguments
php pdoonecli --databasetype mysql --server 127.0.0.1 -u root -p abc.123 --database sakila -in actor -out csv
# # via user input (interactive)
php pdoonecli -i -in actor -out csvСохранить конфигурацию в файле
php pdoonecli --databasetype mysql --server 127.0.0.1 -u root -p abc.123 --database sakila --saveconfig myconfigЗагрузите конфигурацию из файла
php pdoonecli --loadconfig myconfig -in actor -out csvВы можете использовать флаг «-Cli» для создания классов репозитория

CLI интерактивно, и он позволяет загружать и сохранять конфигурацию.
Функциональность будет генерировать класс готового к использованию репозитория.
Допустим, следующий пример
mysql:
Php pdoone.php -database mysql - -server 127.0.0.1:3306 -root -root -p abc.123 -db sakila - -input "актер" - -выпуск classcode
SQLSRV:
PHP pdoone.php -Database SQLSRV -Server PCJC SQLEXPRESS -USER SA -P ABC.123 -DB SAKILA -Input "ACTOR" - -OTPUT CLASSCODE
Он будет подключаться к базе данных MySQL, IP: 127.0.0.1 и базы данных Sakila, и он будет читать таблицу «актер».
Он вернет следующий результат
/**
* Generated by PdoOne Version 1.28
* Class ActorRepo
*/
class ActorRepo
{
const TABLE = ' Actor ' ;
const PK = ' actor_id ' ;
/** @var PdoOne */
public static $ pdoOne = null ;
/**
* It creates a new table<br>
* If the table exists then the operation is ignored (and it returns false)
*
* @param array $definition
* @param null $extra
*
* @return array|bool|PDOStatement
* @throws Exception
*/
public static function createTable ( $ definition , $ extra = null ) {
if (! self :: getPdoOne ()-> tableExist ( self :: TABLE )) {
return self :: getPdoOne ()-> createTable ( self :: TABLE , $ definition , self :: PK , $ extra );
}
return false ; // table already exist
}
// .....
}Эта функциональность генерирует новый класс репозитория с наиболее распространенными операциями: вставьте, перечислите, обновляйте, удаляйте, получите, подсчитайте, создаете таблицу, таблицу Drop и Truncate Table
Зачем нам генерировать класс? (Вместо того, чтобы наследовать). Этот класс CRUD является лишь отправной точкой. Разработчик может изменить код, добавить новые методы, изменить предыдущий метод и так далее.
Чтобы использовать класс, мы могли бы написать следующий код:
// 1) option 1, inject an instance of $pdo
ActorRepo:: setPdoOne ( $ pdoOne ); // it inject the current connect to the database
// 2) option 2.
// If the global variable $pdoOne exists, then it is injected. (unless it is defined by using setPdoOne()
$ pdoOne = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ pdoOne -> connect ();
// 3) option 3
// If the global function pdoOne() exists, then it is used for obtain the instance.
function pdoOne () {
global $ pdo ;
if ( $ pdo === null ) {
$ pdo = new PdoOne ( ' mysql ' , ' 127.0.0.1 ' , ' root ' , ' abc.123 ' , ' sakila ' );
}
return $ pdo ;
}
$ actorActorRepo :: get ( 2 ); // it will read the actor with the pk=2 and it will return as an array.
$ actors = $ actorArray =ActorRepo:: select (); // it returns all the rows.В качестве альтернативы, вы можете автоматически генерировать файл PHP следующим образом:
PHP pdoone.php -database mysql -server 127.0.0.1:3306 -Ser root -pwd abc.123 -db sakila -Input "актер" -включение класса> actorrepo.php
Примечание: в коде не хватает PHP-tags, пространство имен и использование, но все остальное здесь.
Он займет запрос и вернет код PHP с отформатированным запросом.
Пример:
php pdoone.php -database mysql -server 127.0.0.1:3306 -Ser root -pwd abc.123 -db sakila -input "select * from actor" -Output selectcode
Он генерирует следующий код:
/** @var array $result=array(["actor_id"=>0,"first_name"=>'',"last_name"=>'',"last_update"=>'']) */
$ result = $ pdo
-> select ( " * " )
-> from ( " actor " )
-> toList ();Он будет генерировать ассоциативный массив (со значениями по умолчанию) на основе выбранной запроса или таблицы.
PHP pdoone.php -database mysql -server 127.0.0.1:3306 -Ser root -pwd abc.123 -db sakila -Input "select * from Actor" -Output Arraycode
Он вернется:
// ["actor_id"=>0,"first_name"=>'',"last_name"=>'',"last_update"=>'']Он вернет результат запроса как JSON
php pdoone.php -database mysql -server 127.0.0.1:3306 -Ser root -pwd abc.123 -db sakila -input "select * from actor" -Output json
Он вернется:
[{ "actor_id" : " 1 " , "first_name" : " PENELOPE " , "last_name" : " GUINESS " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 2 " , "first_name" : " NICK " , "last_name" : " WAHLBERG " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 3 " , "first_name" : " ED " , "last_name" : " CHASE " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 4 " , "first_name" : " JENNIFER " , "last_name" : " DAVIS " , " last_update " }]Он вернет результат запроса как JSON
php pdoone.php -database mysql -server 127.0.0.1:3306 -Ser root -pwd abc.123 -db sakila -input "select * from actor" -Output csv
Он вернется:
actor_id,first_name,last_name,last_update
1,"PENELOPE","GUINESS","2006-02-15 01:34:33"
2,"NICK","WAHLBERG","2006-02-15 01:34:33"
3,"ED","CHASE","2006-02-15 01:34:33"
4,"JENNIFER","DAVIS","2006-02-15 01:34:33"
В качестве альтернативы CLI, библиотека имеет интерфейсную визуальную. Он выполняет всю работу CLI.

Просто вызовите метод render ()
<?php
use eftec PdoOne ;
use mapache_commons Collection ;
include " ../vendor/autoload.php " ;
$ dao = new PdoOne ( " test " , " 127.0.0.1 " , " dummy " , " dummy " , " dummy " ); // we need any connection.
$ dao -> logLevel = 3 ;
$ dao -> render ();В папке есть пример примеров/testui.php
Следующие команды обычно выполняются в одиночку (не в цепочке методов)
| Метод | Описание | Пример |
|---|---|---|
| Createletable () | Создает таблицу и индексы, используя определение внутри репо | TABLAPARENTREPO :: Createletable (); |
| CreateForeignKeys () | Создать все иностранные ключи таблицы | TABLAPARENTREPO :: CreateForeignKeys (); |
| Droptable () | Бросить стол | TABLAPARENTREPO :: DROPTABLE (); |
| усечение () | Усечь таблицу | TABLAPARENTREPO :: Truncate (); |
| valytable () | Проверить, если таблица не изменилась | $ ok = tablaparentrepo :: valytable (); |
TablaParentRepo:: createTable ();
TablaParentRepo:: createForeignKeys ();
TablaParentRepo:: dropTable ();
TablaParentRepo:: truncate ();
// We don't have a method to alter a table.
$ ok =TablaParentRepo:: validTable (); // it returns true if the table matches with the definition stored into the clasВложенные операторы - это методы, которые должны находиться между нашей цепочкой методов.
Classrepo :: op () :: where () :: finalop () is ✅
Classrepo :: op () :: op () :: где () оставит цепь открытой
Например:
// select *
// from table
// inner join table2 on t1=t2
// where col=:arg
// and col2=:arg2
// group by col
// having col3=:arg3
// order by col
// limit 20,30
$ results = $ pdo -> select ( ' * ' )
-> from ( ' table ' )
-> innerjoin ( ' table2 on t1=t2 ' )
-> where ( ' col=:arg and col2:=arg2 ' ,[ 20 , 30 ])
// it also works with ->where('col=:arg',20)->where('col2'=>30)
// it also works with ->where('col=?',20)->where('col2=?'=>30)
-> group ( ' col ' )
-> having ( ' col3=:arg3 ' , 400 )
-> order ( ' col ' )
-> limit ( ' 20,30 ' )
-> toList (); // end of the chain| Метод | Описание | Пример |
|---|---|---|
| где() | Он добавляет, куда к цепи | TABLAPARENTREPO :: Где () |
| заказ() | Он добавляет заказ к цепочке | TABLAPARENTREPO :: order () |
| группа() | он добавляет группу к цепи | TABLAPARENTREPO :: Group () |
| предел () | Это ограничивает результаты | TABLAPARENTREPO :: Limit () |
| страница() | Это похоже на ограничение, но использует страницу | TABLAPARENTREPO :: PAGE () |
| innerjoin () | Это добавляет внутреннее соединение к запросу | TABLAPARENTREPO :: innerjoin () |
| левый() | Это добавляет влево соединение к запросу | TABLAPARENTREPO :: LEAND () |
| верно() | Это добавляет правое соединение к запросу | TABLAPARENTREPO :: right () |
У нас есть разные методы для создания команды DQL (запрос) в нашей базе данных.
Если операция не удастся, они возвращают ложь, и они могут вызвать исключение.
Следующие методы должны быть в конце цепи. Примеры:
Classrepo :: op () :: op () :: tolist () is ✅
Classrepo :: op () :: tolist () :: op () запустит исключение
| Командование | Описание | Пример |
|---|---|---|
| Толист () | Возвращает множество элементов | $ DATA = TABLENAMEREPO :: TOLIST (); // выберите * из TableRepo $ data = tablenamerepo :: where ('a1 =?', [$ value]) :: tolist (); // выберите * из TableRepo, где a1 = $ value |
| первый() | Возвращает простой ряд | $ DATA = TABLENAMEREPO :: First ($ PK); // Выберите * из TableRepo, где pk = $ pk (он всегда возвращает 1 или нулевые значения) $ DATA = TABLENAMEREPO :: Где ('a1 =?', [$ value]) :: first (); // он возвращает первое значение (или ложное, если не найдено) |
| существовать() | Возвращает True, если существует первичный ключ | $ data = tablenamerepo :: существует ($ pk); // возвращает true, если объект существует. |
| считать() | Возвращает количество рядов в запросе | $ DATA = TABLENAMEREPO :: COUNT ($ Условия); $ DATA = TABLENAMEREPO :: Где ('a1 =?', [$ value]) :: count (); |
Следующие методы позволяют вставлять, обновлять или удалять значения в базу данных.
| Метод | Описание | Пример |
|---|---|---|
| вставлять | Он вставляет значение в базу данных. Это может вернуть личность | $ identity = tablaparentrepo :: insert ($ obj); |
| обновлять | Он обновляет значение в базе данных. | TABLAPARENTREPO :: Update ($ OBJ); |
| удалить | Он удаляет значение из базы данных. | TABLAPARENTREPO :: DEDETE ($ OBJ); |
| DeleteByid | Он удаляет значение (используя первичный ключ в качестве условия) из базы данных. | TABLAPARENTREPO :: DELETEBYID ($ PK); |
// where obj is an associative array or an object, where the keys are the name of the columns (case sensitive)
$ identity =TablaParentRepo:: insert ( $ obj );
TablaParentRepo:: update ( $ obj );
TablaParentRepo:: delete ( $ obj );
TablaParentRepo:: deleteById (id);Можно проверить модель. Модель проверяется с использованием информации базы данных, используя тип столбца, длину, если значение позволяет нулевой, и если это идентификация (автоматическая числовая).
$ obj =[ ' IdUser ' => 1 , ' Name ' ='John Doe'];
UserRepo:: validateModel ( $ obj , false ,[ ' _messages ' ]); // returns true if $obj is a valid User.Рекурсивный массив - это массив строк со значениями, которые его можно было прочитать или получить или сравнить. Например, для условного присоединения к таблице. PDOONE не использует его напрямую, но _BASEPDOONEREPO его использует (_BASEPDOONEREPO - это класс, используемый, когда мы автоматически генерируем класс службы репозитория).
Пример
$ this -> select ( ' * ' )-> from ( ' table ' )-> recursive ([ ' table1 ' , ' table1.table2 ' ]);
// some operations that involves recursive
if ( $ this -> hasRecursive ( ' table1 ' )) {
$ this -> innerJoin ( ' table1 on table.c=table1.c ' );
}
if ( $ this -> hasRecursive ( ' table1.table2 ' )) {
$ this -> innerJoin ( ' table1 on table1.c=table2.c ' );
}
$ r = $ this -> toList (); // recursive is resetted. Он устанавливает рекурсивный массив.
Это значение сбрасывается каждый раз, когда цепные методы заканчиваются.
Он получает рекурсивный массив.
Это возвращает истинно, если рекурсив имеет немного иглы.
Если $ this-> рекурсивный ['*'], то это всегда возвращает истинность.
$ this -> select ( ' * ' )-> from ( ' table ' )-> recursive ([ ' * ' ]);
$ this -> hasRecursive ( ' anything ' ); // it always returns true. | Библиотека | Вставлять | findpk | гидрат | с | время |
|---|---|---|---|---|---|
| КПД | 671 | 60 | 278 | 887 | 3,74 |
| КПД | 774 | 63 | 292 | 903 | 4,73 |
| Меньшекл | 1413 | 133 | 539 | 825 | 5984 |
| Yiim | 2260 | 127 | 446 | 1516 | 8 415 |
| Yiimwithcache | 1925 | 122 | 421 | 1547 | 7 854 |
| Yii2m | 4344 | 208 | 632 | 1165 | 11 968 |
| Yii2marrayhydrate | 4114 | 213 | 531 | 1073 | 11,22 |
| Yii2mscalarhydrate | 4150 | 198 | 421 | 516 | 9 537 |
| Пропл20 | 2507 | 123 | 1373 | 1960 | 11 781 |
| Propel20withcache | 1519 | 68 | 1045 | 1454 | 8 228 |
| Propel20formatondemand | 1501 | 72 | 994 | 1423 | 8 228 |
| Доктринем | 2119 | 250 | 1592 | 1258 | 18,139 |
| Dectrinemwithcache | 2084 | 243 | 1634 | 1155 | 17 952 |
| Доктринэрайдрат | 2137 | 240 | 1230 | 877 | 16,83 |
| Доктринескаларгидрат | 2084 | 392 | 1542 | 939 | 18 887 |
| Доктринэмпетропроток | 2119 | 252 | 1432 | 1960 | 19 822 |
| Красноречивая | 3691 | 228 | 708 | 1413 | 12 155 |
PDOONE добавляет немного Ovehead по PDO, однако это просто обертка для PDO.
Это означает, что вы обновляете PDOONE, и вы используете один класс, сгенерированный ORM. Этот класс должен быть повторно сгенерирован.
В двух словах:
Каждая крупная версия означает, что он может сломать старый код. Т.е. 1,0 -> 2,0
Каждая незначительная версия означает, что она добавляет новую функциональность, то есть 1,5 -> 1.6 (новые методы)
Каждая десятичная версия означает, что она исправляет/исправляет/рефакторирует предыдущую функциональность, т.е. 1.5.0 -> 1.5.1 (исправление)
4.10 2024-09-06
4.9.2 2024-08-20
4.9.1 2024-08-20
4.9 2024-08-02
4,8 2024-07-06
4.7.1 2024-06-07
4.7 2024-06-07
4.6.2 2024-03-02
4.6.1 2024-03-02
4.6 2024-03-02
4.4 2023-12-12
4.3.3 2023-09-05
4.3.2 2023-09-05
4.3.1 2023-09-02
4.3 2023-07-01
4.2 2023-04-07
4.1.2 2023-03-21
4.1.1 2023-03-21
4.1 2023-03-20
4.0.1 2023-03-11
4.00 2023-11-03
3.16 2023-12-02
3.15 2023-02-03
3.14 2023-01-30
3.13 2023-01-26
3.12.2 2022-09-03
3.12.1 2022-08-26
3.12 2022-08-14
3.11.1 2022-07-30
3.11 2022-07-30
3.10 2022-07-30
3.9 2022-07-23
3.8.1 2022-07-23
3.8 2022-07-22
3.7 2022-07-16
3.6 2022-07-07
3.5 2022-07-06
3.3 2022-06-27
3.2 2022-06-27
3.1.6 2022-06-24
3.1.5 2022-06-23
3.1.4 2022-06-21
3.1.3 2022-06-18
3.1.2 2022-06-18
3.1.1 2022-06-17
3.1 2022-06-11
3.0 2022-06-1
2.32 2022-03-20
2.31 2022-03-04
2.30 2022-02-28
2.29 2022-02-20
2.27 2022-02-19
2.26 2022-02-19
2.25 2022-02-01
2.24.1 2022-02-06
2.24 2022-02-06
2.23 2022-02-04
2.22.2 2022-02-01
2.22.1 2022-01-03
2.22 2022-01-30
2.21 2022-01-28
However, it is far from perfect.
2.20 2022-01-04
2.19
2.18
2.16
2.15 2021-07-24
2.14.3 2021-06-15
2.14.2 2021-06-13
2.14.1 2021-06-09
2.14 2021-06-04
_BasePdoOneRepo now works more closely with the class PdoOneQuery , so each query is a different instance.
[fix] PdoOne dateConvertInput() does not crash when the value is not a date.
[fix] PdoOne throwError() does not stack errors but still triggers the last error (if any).
[changes] ❗ PdoOne aggregate functions (sum,min,max,avg) now returns a value instead of generating a query.
$result=$pdo->sum('xxx')->firstScalar(); // before $result=$pdo->sum('xxx'); // сейчас
[fix] PdoOne generateCodeArray() used for the generation of classes, returns the correct name when it is set.
[changes] _BasePdoOneRepo : reset(),getQuery(),dropTable(),useCache(),limit(),newQuery(),order(),innerjoin(),left() ,right()
[changes] PdoOneQuery : Multiples changes.
2.13.1 2021-05-22
2.13 2021-04-17
2.12 2021-04-17
2.11.1 2021-04-17
2.11 2021-04-17
2.10.3 2021-04-14
2.10.2 2021-04-06
2.10.1 2021-04-05
2.10 2021-04-04
2.9.4 2021-03-22
2.9.3 2021-02-22
2.9.2 2021-02-18
2.9.1 2021-02-16
2.9 2021-02-16
2.8 2021-02-13
2.7.1 2021-01-21
2.7 2021-01-10
2.6.3 2020-10-16
2.6.2 2020-10-09
2.6.1 2020-09-24
2.6 2020-09-17
2.5 2020-09-13
2.4.1 2020-09-13
2.4 2020-09-06
2.3 2020-09-06
2.2.6 2020-09-03
2.2.5 2020-08-30
2.2.3 2020-08-23
2.2.2 2020-08-17
2.2.1 2020-08-16
2.2 2020-08-14
$ this -> setUseInternalCache ( true );
$ rows = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 1 ])-> toList (); // read from the database
// ...
$ rows2 = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 1 ])-> toList (); // read from memory
// ...
$ rows3 = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 2 ])-> toList (); // read from the database because the query is in
// memory but the parameters are different
echo $ this -> internalCacheCounter ; The internal cache is tested with runRawQuery (if returns an array), toList(), meta() and first()
2.0.1 2020-08-12
2.0 2020-08-11
1.55.1 2020-08-05
1.55 2020-8-05
1.54 2020-8-02
1.53 2020-7-27
1.52 2020-7-19
1.51 2020-7-18
1.50 2020-7-04
1.49 2020-6-19
1.48 2020-6-15
1.47 2020-6-14
1.46 2020-6-13
1.45.1 2020-6-11
1.45 2020-6-7
1.44.2 2020-6-3
1.44.1 2020-6-2
1.44 2020-5-31
1.43 2020-5-31
1.42 2020-5-29
1.41.2 2020-5-29
1.41.1 2020-5-28
1.41 2020-5-28
1.40.1 2020-5-27
1.40 2020-05-21
1.39 2020-05-12
1.38 2020-05-10
1.37 2020-05-03
1.36 2020-05-03
1.35.1 2020-04-30
1.35 2020-04-28
1.34.2 2020-04-27
1.34.1 2020-04-27
1.34 2020-04-27
1.33 2020-04-15
1.32.1 BasePdoOneRepo added version 2.0
1.32 2020-04-12
1.31.1 2020-04-11
1.31 2020-04-11
1.30 2020-04-10
1.29 2020-04-10
1.28.1 2020-04-06
1.28 2020-04-06
1.24 2020-03-26
1.23.1 2020-03-10
1.23 2020-03-10
1.22 2020-02-08
1.21 2020-02-07
1.20 2020-jan-25
1.19 2020-jan-15
1.16 2020-jan-14
1.15 2019-dec-29
1.14 2019-dec-26
1.13 2019-dec-26
1.12 2019-oct-20 Added argument (optional) ->toList($pdomodel) Added method ->toListSimple()
1.11 2019-oct-01 1.11 It is still compatible with php 5.6.Added to composer.json
1.10 2019-oct-01 1.10 Added method dateConvert(). Added trace to the throw.
1.9 2019-aug-10 1.8 republished
1.8 2019-aug-10 Added a date format. Methods dateSql2Text() and dateText2Sql()
1.7 2019-jun-23 Added some benchmark. It also solves a problem with the tags. Now: table.field=? is converted to table . field =?
1.6 2019-jun-22 affected_rows() returns a correct value.
1.5 2019-may-31 some cleanups. columnTable() returns if the column is nullable or not.
1.4 2019-may-30 insertobject()
1.3 2019-may-23 New changes
1.2 2019-may-22 New fixed.
1.1 2019-may-21 Some maintenance
1.0 2019-may-21 First version