CakePHPではデータベースのSQLクエリーを実行できるクエリービルダーという機能があります。
この記事では、
・クエリービルダー( QueryBuilder)とは
・クエリービルダー( QueryBuilder)のselectメソッドとは
・selectメソッドの基本的な使い方
・selectメソッドでSQL関数を使用する方法
などのクエリービルダーのselectメソッドの使い方について解説していきます。
SQLクエリが実行できるクエリービルダーはCakePHPでは必須の機能となりますので、この記事を読んで基本的な使いかたを覚えておきましょう!
クエリービルダー( QueryBuilder)とは
クエリービルダー(QueryBuilder)とはSQLクエリーをORMで実行できるインターフェイスです。
クエリーを組み合わせることにより、高度なクエリーも簡単に作成することができます。
クエリービルダーは以下のように使用します。
use Cake\ORM\TableRegistry; $テーブル= TableRegistry::get(‘テーブル名’); // 新しいクエリーを始めます。 $query = $テーブル->find();
クエリービルダーはまずTableRegistry::getメソッドでテーブルのインスタンスを取得します。
そして、生成したテーブルオブジェクトを元に、クエリービルダーで用意されているさまざまなクエリーを使用することができます。
クエリービルダーの使い方については、以下の記事でも詳しく解説しています!
次項よりクエリービルダーで使用できるselectメソッドの使い方について解説します。
selectメソッドとは
クエリービルダーで使用するselectメソッドは、SQLのSELECT文と同様の機能を持ち、テーブルから指定したデータを抽出するときに使用します。
SELECT文はクエリーの中でも最も良く使用される命令文で、クエリービルダーのselectメソッドでは以下のように使用します。
$query = $テーブル->find(); $query->select(['id', 'title', 'body']);
selectメソッドの使い方
selectメソッドの基本的な使い方
ここでは、実際にテーブルを作成してクエリービルダーのselectメソッドを使用してみましょう。
以下のコマンドを実行してデータベースを作成しておきます。
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"', 450);
次に「Cake/src/Controller/FruitsController.php」を作成して以下のように記述します。
Cake/src/Controller/FruitsController.php
<?php namespace App\Controller; use App\Controller\AppController; use Cake\ORM\TableRegistry; class FruitsController extends AppController { public function index() { //テーブルを取得 $fruitsTable = TableRegistry::get('fruits'); $query = $fruitsTable->find(); $query->select(['fruits', 'value']); foreach ($query as $row) { debug($row); } $this->set('fruits', $query); } }
先述したとおり、クエリービルダーを使用するためには、TableRegistryを指定してインスタンスを取得する必要があります。
TableRegistryなどのテーブルオブジェクトを使用するには「use Cake\ORM\TableRegistry;」を定義する必要があります。
このサンプルでは、生成した$fruitsTableオブジェクトを元にfind()でテーブル変数$queryを作成します。
クエリービルダーは、作成したテーブル変数に対して使用することができます。
ここでは$queryに対してselectを実行して’fruits’, ‘value’の列を取得しています。
次にindex.ctpファイルを作成します。
Cake/src/Template/Fruits/index.ctp
<h1>Fruits</h1> <table> <tr> <th>fruits</th> <th>value</th> </tr> <?php foreach ($fruits as $item): ?> <tr> <td><?= $item->fruits ?></td> <td><?= $item->value ?></td> </td> </tr> <?php endforeach; ?> </table>
このプログラムを実行すると、まずクエリービルダーのselectメソッドで取得した’fruits’, ‘value’の情報がdebugで出力されます。
object(App\Model\Entity\Fruit) { 'fruits' => '"apple"', 'value' => (int) 100, '[new]' => false, '[accessible]' => [ '*' => true, 'id' => false ], ・・・中略・・・
設定したテーブルの情報が正しく出力されていることがわかりますね!
debugの使いかたについては、以下の記事で詳しく解説しています!
また、「$this->set(‘fruits’, $query)」でViewにselectで取得したテーブルの情報を渡すことで、テーブルのデータをViewで使用することができます。
↑Viewの実行結果
selectメソッドでSQLの関数を使用する
selectメソッドを使用すれば、SQLのさまざまな関数を使用できます。
以下のサンプルではcount()を使用してレコードの件数を取得しています。
//テーブルを取得 $fruitsTable = TableRegistry::get('fruits'); $query = $fruitsTable->find(); $query->select(['count' => $query->func()->count('*')]); foreach ($query as $row) { debug($row); }
実行結果:
object(App\Model\Entity\Fruit) { 'count' => (int) 4, '[new]' => false, '[accessible]' => [ '*' => true, 'id' => false ], ・・・省略・・・
まとめ
ここではクエリービルダー(QueryBuilder)で使用できるselectメソッドについて、基本的な使い方やselectメソッドで使用できるSQLの関数などについて紹介しました。
CakePHPでデータベースを使用する上で、クエリービルダーの知識は必須となりますので、仕組みはよく理解しておきましょう。
もしselectメソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!