PHPとPDONEを使用したMySQLデータベースへのアクセス

38650 ワード

PHPとPDONEを使用したMySQLデータベースへのアクセス


PDONEは2つの目標:パフォーマンスと無依存のライブラリです.このライブラリは、5つのクラスと単一のインターフェイスで構成されます.
https://github.com/EFTEC/PdoOne
このライブラリには、データベースで動作するように3種類の方法が含まれます.

請求書の例。


我々の運動のために、我々はインボイスを挿入して読むためにそれを使用します.このモデルには3つのテーブルがあります.
  • 請求書:それは請求書のヘッダー、請求書の数、日付、および顧客
  • へのそのリンクを格納するでしょう
  • 客:それは顧客と名前のIDで顧客を持つでしょう.
  • InvoiceRange詳細:それは製品の詳細やリストがあります.他の値を計算することができます.

  • 例データベースの作成


    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);
    
    このメソッドは次の操作を行います.
  • それは値を挿入します(あるいは、例外を返すか、falseを返します)
  • と$ Identityでアイデンティティを返します.また、$ 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 );
    クラスリポジトリが生成されると、ライブラリはすべての外部キーを収集しました.外部キーでは、いくつかのリレーションシップを生成できます.この場合、次のリレーションシップが生成されます.
  • ManytoOne請求書の詳細

  • onetomany invoices -> invoiceRoundの詳細( Cache - InvoiceConeの詳細を使用する)

  • Manytoone請求書->顧客
  • Onetomany顧客->請求書
  • 複数のテーブル操作を行う場合、すなわち1つ以上のテーブルを含む操作を行う場合、setrecursive
  • setrecursive ( string :リレーションの型)を返します.
  • 以下を参照してください.
  • invoicerepo : setrecursive (' manytoone );//これは、タイプManytoone(すなわち、お客様)のすべての関係が含まれます.
  • invoicerepo : setrecursive ('*));//これは、任意の関係が含まれてテーブルの請求書の関係(すなわち、請求書の詳細と怒りの顧客).
  • setrecursive ( array : column )を返します.
  • また、文字を使用して別のフィールドの中に再帰的な値を読み込むこともできます("/"
    // 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']); 
    

    エンドノート.

  • 最初の方法はpdo拡張子のベアメタルで動作し、最速のメソッドです.しかし、それはより多くの仕事を必要とします.このメソッドは、速度が必要な場合やPDOの関数にアクセスする必要がある場合には最適です.
  • 第2の方法は柔軟ですが、プログラマは問い合わせを知る必要があります.このメソッドは、フロントエンドのリスト値などの戻り値と戻り値に最適です.
  • 第3の方法は、より制限されます、しかし、それはそれで働くのが簡単です.また、テーブルを「コンパイル」し、テーブルとリレーションシップを一連のクラスに変換する必要があります.この方法はバックエンドに理想的です.このメソッドがフードの下で多くの操作をするときでも、それは何をしているかを決定するためにコントロールを与えます.
  • 私たちは、図書館PDONEが私たちに同じプロジェクトで同時にそれらを使用するのを許すことを忘れてはいけません
    //すべてを使用します.
    $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