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メソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!






