【CakePHP入門】QueryBuilderのselectメソッドの使い方

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で使用することができます。

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

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次