CakePHP3でSQLクエリを作成するパターンを纏めてみました。
そのSELECT編です。
目次
find
$this->Hoges->find()
->where(条件)
->order(条件)
->order(条件)
->select(フィールド)
->all()
WHERE区の指定方法
AND条件A
$this->Hoges->find()->where(['Hoges.id' => 1, 'Hoges.name LIKE' => '%AAA%']);
AND条件B
$this->Hoges->find()->where(['Hoges.id' => 1])
->where(['Hoges.name LIKE' => '%AAA%']);
出力されるSQLのWHERE区
WHERE Hoges.id = 1 AND Hoges.name LIKE '%AAAA%';
上記の記載は両方同じ出力。内部の条件はANDとなる。
OR条件A
$this->Hoges->find()->where(['OR' => ['Hoges.id' => 1, 'Hoges.name' => 'BBB']]);
出力されるSQLのWHERE区
WHERE Hoges.id = 1 AND Hoges.name LIKE '%AAAA%';
AND ORの複合条件
$this->Hoges->find()->where(['Hoges.id' => 1, 'OR' => [['Hoges.name LIKE' => '%AAAA%'], ['Hoges.name LIKE' => '%BBBB%']]]);
出力されるSQLのWHERE区
WHERE Hoges.id = 1 AND (Hoges.name LIKE '%AAAA%' OR Hoges.name LIKE '%BBBB%');
1件のみ取得する方法
基本的に指定が無ければ全件取得されてしまいます。
1件の指定方法には”first”を利用します。
firstを使った検索
$this->Hoges->find()->where(['Hoges.id' => 1])->first();
最後にfirst()を使用すればok。
ORDERによるソート
ORDER区による並び順も単純なので、簡単に記載します。
WHERE区に続けて、以下の記載でok。
カラム名とDESC/ASCを指定し、メソッドチェーンで複数指定が可能。
->order(['Hoges.id' => 'DESC']);
OFFSET, LIMIT
OFFSET, LIMITの記載方法も同様です。
WHERE区に続けて、以下の記載でok。
メソッドチェーンでlimit(), offset()に指定の数値を指定する。
->limit(100)->offset(100);
GROUP BY, HAVING
OFFSET, LIMITの記載方法も同様です。
->group(['Hoges.id'])->having(['Hoges.id >' => 100]);