Query Builderの基本【CakePHP4】

概要

CakePHP4のQueryBuilder(DBからデータを取得するクエリの生成)についての基本を簡単にまとめる。

前提:ControllerからTableを呼び出す。

※model、entityはbakeコマンドで生成済みの状態を前提とする。

Table呼び出しのサンプル

下記のように行う。

class SamplesController extends AppController{

      //テーブルの登録
      private $usersTable;
      public function beforeFilter(\Cake\Event\EventInterface $event)
      {
           parent::beforeFilter($event);
           $this->usersTable = $this->getTableLocator()->get('Users');
      }
   
      public function piyo(){
          //beforeFilter()で指定することで以下のように使えるようになる。
          $user = $this->usersTable->find()・・・
      }

ControllerからTableを呼び出す方法については、以前こちらの記事でも紹介済み。

基本:全件取得

全ユーザデータを取得する

$users = $this->usersTable->find()->all();

Contain句:子テーブルも含めて取得する

子テーブル(”articles”,”informations”)も含めて全件取得

$users = $this->usersTable->find()->contain(["articles","informations"])->all();

Where句

特定の条件に合致するデータを全て取得

nameが”サンプル”であるデータを全権取得

$users = $this->usersTable->find()->where(["name" => "サンプル"])->all();

特定の条件に合致するデータを1件取得

nameが”サンプル”であるデータのうち最初の1件を取得

$user = $this->usersTable->find()->where(["name" => "サンプル"])->first();

nameが”サンプル”であるデータのうち最後の1件を取得

$user = $this->usersTable->find()->where(["name" => "サンプル"])->last();

AND検索

「”name”が”サンプル”、かつ”class”が”1”」のデータを取得

$users = $this->usersTable->find()->where(["name" => "サンプル"])->where(["class" => 1])->all();

OR検索

”name”が”sample”、もしくは”class”が”1”」のデータを取得

$users = $this->usersTable->find()
              ->where([
                 "OR" =>
                   [
                     ["name" => "sample"],
                     ["id" => 1],
                   ]
               ])->all();

LIKE演算子(特定の文字列を含む)

“サンプル”さんだけでなく”サンプル太郎”さんもヒットする

$users = $this->usersTable->find()
              ->where(["name LIKE" => "%サンプル%"])->all();

NOT演算子(条件に一致しないものを取得)

名前が”サンプル”以外のデータを全権取得

$users = $this->usersTable->find()
              ->where(["name IS NOT" => "サンプル"])->all();

IN演算子(いずれかに一致するものを取得)

“name”が”サンプル”,”サンプル太郎”,”サンプル二郎”のいずれかであるデータを取得

$array = ["サンプル","サンプル太郎","サンプル二郎"]
$users = $this->usersTable->find()
              ->where(["name IN" => $array])->all();

NOT演算子 + IN演算子(いずれにも一致しない)

“サンプル”、”サンプル太郎”、”サンプル二郎”のいずれにも一致しないデータを取得

$array = ["サンプル","サンプル太郎","サンプル二郎"]
$users = $this->usersTable->find()
              ->where([
                    'NOT' => ['name IN' =>$array]
               ])->all();

応用:Containした子テーブルを条件に検索

下記の記事を参照のこと

Order句:取得データの並べ替え

id順:昇順(1~)

$users = $this->usersTable->find()->order(["id" => "ASC"])->all();

id順:降順(idの最大値~1)

$users = $this->usersTable->find()->order(["id" => "DESC"])->all();

参考

Cakephp公式:クエリービルダー データの取り出しと結果セット

コメント

タイトルとURLをコピーしました