【CakePHP入門】QueryBuilderの使い方をわかりやすく解説!

こんにちは!フリーエンジニアのヤマシタです。

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);

次にbakemodelcontrollerの雛形を自動生成します。

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"'

スクリーンショット 2017-07-18 20.33.45

サンプルでは、$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'));

実行結果

kekka

データを追加するには、連想配列で追加するデータを作成しておき、行を追加するinsert()メソッドを実行します。

データを追加するには、テーブル行数分を回してvalues()メソッドで1つずつデータを追加します。

まとめ

ここでは、SQLの命令文をメソッドで実行できるクエリービルダー(QueryBuilder)について解説しました。

クエリービルダーを使用すれば、SQLの複雑な命令文でもメソッドで簡単に実行することができます。

PHPではデータベースを使用する機会が多いので、クエリービルダーについてはぜひ覚えておきましょう。

もしクエリービルダーの使い方を忘れてしまったら、この記事を思い出してくださいね。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。