CakePHPにはSQLの命令文をメソッドで実行できるクエリービルダー(QueryBuilder)という機能があります。
この記事では、
・クエリービルダー(QueryBuilder)とは
・クエリービルダーの基本的な使い方
という基本的な内容から、
・クエリービルダーでメソッドチェーンをする方法
・指定した行だけ取得する方法
・複数データを更新する方法
などの応用的な使い方について解説します。
ここではクエリービルダーでSQLの操作を実行する方法について、詳しく解説していきます!
クエリービルダー(QueryBuilder)とは
クエリービルダー(QueryBuilder)とは、SQLの命令文(クエリー)を作成して実行するための機能です。
クエリービルダーを使用すれば、SQLのクエリーを使わずにメソッドを呼び出すだけで複雑なSQLの命令文を行うことが可能です。
クエリービルダーによるQueryオブジェクトを作成するには、Tableオブジェクトからfind()メソッドを指定します。
$articles = TableRegistry::get('Articles'); $query = $articles->find();
クエリービルダー(QueryBuilder)の使い方
ここでは、実際にクエリービルダーを使用して、テーブルを参照するプログラムを作成してみましょう。
事前準備として、以下のデータベースを作成しておきます。
CREATE TABLE fruits ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, fruits VARCHAR(32), value INT );
続いて、INSERT文でデータを設定します。
INSERT INTO fruits (fruits, value) VALUES ('"apple"', 100); INSERT INTO fruits (fruits, value) VALUES ('"orange"', 80); INSERT INTO fruits (fruits, value) VALUES ('"melon"', 500); INSERT INTO fruits (fruits, value) VALUES ('"pineapple"', 700);
次にbakeでmodelとcontrollerの雛形を自動生成します。
modelの作成
bin/cake bake model fruits
controllerの作成
bin/cake bake controller fruits
bakeについては、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね。
作成された「Cake/src/Controller/FruitsController.php」を以下のように編集します。
<?php namespace App\Controller; use App\Controller\AppController; use Cake\ORM\TableRegistry; class FruitsController extends AppController { public function index() { //テーブルを取得 $query = TableRegistry::get('fruits')->find(); //テーブルからデータを取得 foreach ($query as $article) { debug($article->fruits); } $this->set('fruits', $this->Fruits->find('all')); } }
次にindex.ctpファイルを作成します。
Cake/src/Template/index.ctp
<h1>Fruits</h1> <table> <tr> <th>Id</th> <th>fruits</th> <th>value</th> </tr> <?php foreach ($fruits as $item): ?> <tr> <td><?= $item->id ?></td> <td><?= $item->fruits ?></td> <td><?= $item->value ?></td> </td> </tr> <?php endforeach; ?> </table>
実行結果
/src/Controller/FruitsController.php (line 16) '"apple"' /src/Controller/FruitsController.php (line 16) '"orange"' /src/Controller/FruitsController.php (line 16) '"melon"' /src/Controller/FruitsController.php (line 16) '"pineapple"'
サンプルでは、$queryに作成したテーブルを取得し、テーブルのデータをforeach文で1つずつ取得しています。
テーブルの操作を行うときはTableRegistryを使用してインスタンスを取得する必要があります。
TableRegistryなどのテーブルオブジェクトを使用するには「use Cake\ORM\TableRegistry;」を定義します。
メソッドチェーンを使用する方法
Queryのオブジェクトの呼出し時にメソッドをチェーンすることもできます。
メソッドチェーンとは、追加したい機能をメソッドでつなげていくことで実現する機能です。
以下にQueryオブジェクトに対して、メソッドチェーンをする方法を記述します。
//テーブルを取得 $fruitsTable = TableRegistry::get('fruits'); //idが1より大きいデータを取得する $query = $fruitsTable ->find() ->where(['id >' => 1]) ->all(); foreach ($query as $article) { debug($article->id); }
実行結果
/src/Controller/FruitsController.php (line 31) (int) 2 /src/Controller/FruitsController.php (line 31) (int) 3 /src/Controller/FruitsController.php (line 31) (int) 4
サンプルでは、メソッドチェーンでテーブルのオブジェクトを取得し、さらにwhere()メソッドでidが1以上のデータをall()メソッドで全て取得しています。
また、first()メソッドを使用すれば、クエリーの最初の結果を取得することができます。
//テーブルを取得 $fruitsTable = TableRegistry::get('fruits'); //idが2の行のデータを取得する $query = $fruitsTable ->find() ->where(['id' => 2]) ->first(); debug($query->fruits);
実行結果
/src/Controller/FruitsController.php (line 44) '"orange"'
データを更新する
クエリービルダーを使用すれば、テーブルにデータを追加して、更新することもできます。
以下の例では、複数の値を追加してテーブルを更新しています。
// 追加するデータを設定 $fruitsdata = [ [ 'fruits' => 'strawberry', 'value' => 350 ], [ 'fruits' => 'kiwi fruit', 'value' => 100 ], ]; //テーブルを取得 $fruitsTable = TableRegistry::get('fruits'); //テーブルにデータを追加する $query = $fruitsTable->query(); $query->insert(['fruits', 'value']); foreach ($fruitsdata as $item) { $query->values($item); } $query->execute(); $this->set('fruits', $this->Fruits->find('all'));
実行結果
データを追加するには、連想配列で追加するデータを作成しておき、行を追加するinsert()メソッドを実行します。
データを追加するには、テーブル行数分を回してvalues()メソッドで1つずつデータを追加します。
まとめ
ここでは、SQLの命令文をメソッドで実行できるクエリービルダー(QueryBuilder)について解説しました。
クエリービルダーを使用すれば、SQLの複雑な命令文でもメソッドで簡単に実行することができます。
PHPではデータベースを使用する機会が多いので、クエリービルダーについてはぜひ覚えておきましょう。
もしクエリービルダーの使い方を忘れてしまったら、この記事を思い出してくださいね。