PHPとPDONEを使用したMySQLデータベースへのアクセス
38650 ワード
PHPとPDONEを使用したMySQLデータベースへのアクセス
PDONEは2つの目標:パフォーマンスと無依存のライブラリです.このライブラリは、5つのクラスと単一のインターフェイスで構成されます.
https://github.com/EFTEC/PdoOne
このライブラリには、データベースで動作するように3種類の方法が含まれます.
請求書の例。
我々の運動のために、我々はインボイスを挿入して読むためにそれを使用します.このモデルには3つのテーブルがあります.
例データベースの作成
MySQLでは、次のスクリプトを実行します.
CREATE SCHEMA `example-pdo` ;
CREATE TABLE `customers` (
`IdCustomer` INT NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(45) NULL,
PRIMARY KEY (`IdCustomer`));
CREATE TABLE `invoices` (
`IdInvoice` INT NOT NULL,
`Date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`IdCustomer` INT NULL,
PRIMARY KEY (`IdInvoice`),
INDEX `invoices_fk1_idx` (`IdCustomer` ASC) VISIBLE,
CONSTRAINT `invoices_fk1`
FOREIGN KEY (`IdCustomer`)
REFERENCES `customers` (`IdCustomer`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE TABLE `invoice_detail` (
`IdInvoiceDetail` INT NOT NULL AUTO_INCREMENT,
`Product` VARCHAR(45) NULL,
`UnitPrice` DECIMAL(10,2) NULL,
`Quantity` INT NULL,
PRIMARY KEY (`IdInvoiceDetail`));
CREATE TABLE `invoice_details` (
`IdInvoiceDetail` INT NOT NULL AUTO_INCREMENT,
`IdInvoice` INT NULL,
`Product` VARCHAR(45) NULL,
`UnitPrice` DECIMAL(10,2) NULL,
`Quantity` INT NULL,
PRIMARY KEY (`IdInvoiceDetail`),
INDEX `invoice_detail_fk1_idx` (`IdInvoice` ASC) VISIBLE,
CONSTRAINT `invoice_detail_fk1`
FOREIGN KEY (`IdInvoice`)
REFERENCES `invoices` (`IdInvoice`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
データベースへの接続
まず、ライブラリをインストールする必要があります.
//3番目のメソッドでは、この変数Globalは$ pdoOneと呼ばれていなければなりません.あるいは、インスタンスを注入する必要があります.
$pdoOne=new PdoOne('mysql','127.0.0.1','root','abc.123','example-pdo'); // type of database, server, user, password, schema name.
$pdoOne->open(); // we will open the connection
$pdoOne->logLevel=3; // it shows all errors with arguments (it is for debug purpose)
方法1 :生のクエリを使用する。
example_simple.php
PDONEは、拡張PDOを使用してデータベースに直接動作する生のクエリを実行できます.それは私たちのコードを実行するための最速の方法ですので、速度が必要な場合は理想的です結局のところ、それはPDOのシンプルなラッパーとして動作します.
挿入
たとえば、顧客を挿入します.
$statement=$pdoOne->runRawQuery('insert into customers(name) values (?)',['John Simple'],false);
$statement->closeCursor(); // it is a pdostatement
$statement=null;
$idCustomer=$pdoOne->insert_id();
RunrawQuery ()メソッドに引数を渡す方法はいくつかあります.runrawquery ()はPDOStatementか配列を返すことができます.デフォルトでは、配列を返しますが、PDOStatementを取得し、拡張子PDOの特殊な機能を使用することもできます.挿入の別の例
$pdoOne->runRawQuery('insert into customers(name) values (?)',['John Simple'],true);
$idCustomer=$pdoOne->insert_id(); // we get the identity.
と別の例$pdoOne->runRawQuery('insert into customers(name) values (:name)',['name'=>'John Simple'],true);
$idCustomer=$pdoOne->insert_id();
echo "added user $idCustomer";
リスティング
$customers=$pdoOne->runRawQuery('select * from customers where name=?',['John Simple']);
var_dump($customers);
値を連想配列で返します.単一のオブジェクトを取得する
$customers=$pdoOne->runRawQuery('select * from customers where idcustomer',[1]);
var_dump($customers); // [0=>['idcustomer'=>1,'name'=>'john']]
var_dump($customers[0]); // ['idcustomer'=>1,'name'=>'john']
完全請求書の挿入
// invoice header
$invoice=['IdInvoice'=>1,'Date'=> PdoOne::dateSqlNow(true), 'IdCustomer'=>1];
$pdoOne->runRawQuery('insert into invoices(idinvoice,date,idcustomer) values(:IdInvoice,:Date,:IdCustomer)',$invoice);
// Creating the detail of the invoice
$invoiceDetail=[1,'Cocacola',1000,3];
$query='insert into invoice_details(idinvoice,product,unitprice,quantity) values (?,?,?,?)';
$pdoOne->runRawQuery($query, $invoiceDetail);
$invoiceDetail=[1,'Fanta',2000,5];
$query='insert into invoice_details(idinvoice,product,unitprice,quantity) values (?,?,?,?)';
$pdoOne->runRawQuery($query, $invoiceDetail);
方法2 :メソッドチェーンの使用
example_method_chains.php
PDONEはまた、メソッドチェーン(fluent)を使用することができます.この方法もBlabboneですので、パフォーマンスは生のクエリに近いです.メソッドのチェーンは、より多くのチェインメソッドのいずれかで動作し、いつでも、チェーンメソッド(INSERT、TRIST、最初、更新など)の一端で終了する必要があります.通常、任意の順序で任意のメソッドをチェーンすることができますが、チェーンの末尾はチェーンの末尾になければなりません.
コードの実行は常にチェーンの末尾にあります.
挿入
挿入を書く方法はたくさんあります.その一つです.
$idCustomer=$pdoOne
->from('customers')
->set(['name'=>'John Chain #1'])
->insert(); // $idcustomer gets the identity if any
also$idCustomer=$pdoOne->insert('customers',['name'=>'John Chain #2']); // $idcustomer gets the identity if any
リスティング
いくつかの方法があります
$customers=$pdoOne->select('*')
->from('customers')
->toList(); // end of the chain, it returns an associative array with the values.
単一のオブジェクトを取得する
また、単一の行を取得することも可能です.ライブラリはまた、単一の値を得ることができます
$customer=$pdoOne->select('*')
->from('customers')
->where('idcustomer=?',[1])
->first();
最初に最初のクエリを返します.クエリが値を返しない場合、falseを返します.クエリが複数行を返す場合は、最初の行だけを返します.完全請求書の挿入
// invoice header
$invoice=['IdInvoice'=>1,'Date'=> PdoOne::dateSqlNow(true), 'IdCustomer'=>1];
$pdoOne->set($invoice)->from('invoices')->insert();
// Creating the detail of the invoice
$invoiceDetail=['IdInvoice'=>1,'Product'=>'Cocacola','UnitPrice'=>1000,'Quantity'=>3];
$pdoOne->set($invoiceDetail)->from('invoice_details')->insert();
$invoiceDetail=['IdInvoice'=>1,'Product'=>'Fanta','UnitPrice'=>5000,'Quantity'=>5];
$pdoOne->set($invoiceDetail)->from('invoice_details')->insert();
方法3 :リポジトリクラスの使用
example_use_generated.php(配列)
example_use_generated_object.php(対象)
この方法は余分なステップが必要です.クラスの新しいセットを作成する必要があります.これらの新しいクラスは事前に計算され、データベースのスキーマから取得されます.一方、ほとんどの値が事前に事前に計算されているので、それは高速ですが、それはまだ他の方法よりも多くを行います.
クラスの作成
example_method_generate.php
我々の演習では、3つのテーブル:顧客、請求書の詳細、請求書を使用します.
テーブルの顧客のために、私たちは2つのクラス、InvoiceDevilrePo(リポジトリのクラス)を生成し、必要に応じてモデルクラス(InvoiceDetail)を生成する必要があります
$errors=$pdoOne->generateAllClasses(
[
'customers'=>['CustomerRepo','Customer'], // table => [repo class, model class]
'invoice_details'=>['InvoiceDetailRepo','InvoiceDetail'],
'invoices'=>['InvoiceRepo','Invoice']
]
,'BaseRepo' // it a common class
,['example\repo','example\model'] // namespaces of the repository class and model class.
,[__DIR__.'\repo',__DIR__.'\model']); // folders to where the repositories and model will be generated, they should exist.
$errors=$pdoOne->generateAllClasses(
[
'customers'=>'CustomerRepo', // table => repo class
'invoice_details'=>'InvoiceDetailRepo',
'invoices'=>'InvoiceRepo'
]
,'BaseRepo' // it a common class
,'example\repo' // namespaces of the repository class.
,__DIR__.'\repo'); // folders to where the repositories will be generated, they should exist.
このクラスを実行すると、次のファイルが生成されます.📁 モデル
📃 抽象的な顧客.PHP/このモデルは、このファイルを生成し、置換することができます.
📃 カスタマー.PHP//モデル(このファイルは編集可能です)
...
📁 レポ
📃 AbstractCustomerRepo.PHP/リポジトリクラスの場合、置換される可能性があるので、このファイルは編集されません
📃 カスタマーレビュー.PHP/リポジトリクラス
📃 基底.すべてのテーブルに共通のPHP//情報.
...
挿入
まず、2つの方法でオブジェクトを作成できます
配列を使いたいなら、次の値を設定しなければなりません
BaseRepo::$useModel=false; // we will use array instead of objects
を使用した配列の作成// using factory
$cus=CustomerRepo
::setRecursive('*')
::factory(['Name' => 'John Generated #1 (Array)']);
// using an array (the keys of the arrays must matches the columns of the table, including the case)
$cus=['Name' => 'John Generated #1 (Array)']; // correct
$cus=['name' => 'John Generated #1 (Array)']; // not correct (the column is called 'Name', not 'name')
またはBaseRepo ::$ USEModel = trueでオブジェクトを作成する// using the constructor
$cus=new Customer(['Name' => 'John Generated #1 (Array)']);
// with empty constructor
$cus=new Customer();
$cus->Name='John Generated #1 (Array)';
そして次のように挿入できます$identity=CustomerRepo::insert($cus);
このメソッドは次の操作を行います.リスティング
これはいくつかの違いを持つメソッドチェーンと同様に動作します.
$r=CustomerRepo::where('IdCustomer',[1])::toList(); // select IdCustomer,Name from customers where IdCustomer=1
単一のオブジェクトを取得する
$invoice=CustomerRepo::where('IdCustomer',[1])::first();
完全請求書の挿入
配列の使用
// header
$invoice=InvoiceRepo::setRecursive('*')::factory(['IdInvoice'=>1,'Date'=> PdoOne::dateSqlNow(true), 'IdCustomer'=>1]);
// InvoiceDetailRepo: IdInvoice islinked automatically, and IdInvoiceDetail is identity.
$invoice['_invoice_details']=[
InvoiceDetailRepo::factory(['Product' => 'Cocacola','UnitPrice' => 1000,'Quantity' => 3]),
InvoiceDetailRepo::factory(['Product' => 'Fanta','UnitPrice' => 5000,'Quantity' => 2])
];
InvoiceRepo::setRecursive('_invoice_details')::insert($invoice);
またはオブジェクトを使用する// header
$invoice=new Invoice();
$invoice->IdInvoice=1;
$invoice->Date=PdoOne::dateSqlNow(true);
$invoice->IdCustomer=1;
// InvoiceDetailRepo: IdInvoice islinked automatically, and IdInvoiceDetail is identity.
$invoice->_invoice_details=[
new InvoiceDetail(['Product' => 'Cocacola','UnitPrice' => 1000,'Quantity' => 3]),
new InvoiceDetail(['Product' => 'Fanta','UnitPrice' => 5000,'Quantity' => 2])
];
InvoiceRepo::setRecursive('_invoice_details')::insert($invoice);
setrecursive ()のメソッドは何ですか?次の行を実行するなら
InvoiceRepo :挿入物($ invoice );
次に、最初のテーブル(インボイス)を考慮して値を挿入します
インボイス(idinvoice、日付、idCustomer)値に挿入します
しかし、我々は請求書の詳細を挿入していません.
代わりに
invoicerepo::setrecursive ('*):::insert ($ invoice );
次の挿入を行います
insert into invoices(..) values (..);
insert into invoice_details(..) values (..);
insert into invoice_details(..) values (..);
insert into customer(..) values (..); -- however we don't want to insert the customer.
したがって、正しい再帰性はInvoIceRepo::setrecursive (' Key InvoiceRangeの詳細):::insert ($ invoice );
クラスリポジトリが生成されると、ライブラリはすべての外部キーを収集しました.外部キーでは、いくつかのリレーションシップを生成できます.この場合、次のリレーションシップが生成されます.
onetomany invoices -> invoiceRoundの詳細( Cache - InvoiceConeの詳細を使用する)
Manytoone請求書->顧客
// examples:
// invoices->customers
InvoiceRepo::setRecursive(['_customers']);
// invoice->customers and invoice->invoice_details
InvoiceRepo::setRecursive(['_customers','_invoice_details']);
// invoice->customers , invoice->invoice_details and invoice_details->invoices
InvoiceRepo::setRecursive(['_customers','_invoice_details/_invoices']);
エンドノート.
//すべてを使用します.
$invoices=InvoiceRepo::toList(); // select IdInvoice,Date,IdCustomer from invoices
$invoices=InvoiceRepo::base()->runRawQuery('select * from invoices'); // select * from invoices
$invoices=InvoiceRepo::base()->select('*')->from('invoices')->toList(); // select * from invoices
ソースコード
https://github.com/escuelainformatica/example-pdoone
Reference
この問題について(PHPとPDONEを使用したMySQLデータベースへのアクセス), 我々は、より多くの情報をここで見つけました https://dev.to/jorgecc/accessing-a-mysql-database-using-php-and-pdoone-fjgテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol