概要
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公式:クエリービルダー データの取り出しと結果セット
コメント