CakePHP クエリービルダーの使い方
CakePHPではクエリービルダーを使ってクエリーを作り、実行することができます。
ここではよく使うクエリービルダーについてまとめました。
条件指定
条件の指定は'conditions'
やwhere()
メソッドを使います。
- どちらも値の一致(
=
)以外では連想配列のキー部分に不等号を記述します
'name <>' => '' // name が空白以外
- どちらも
'OR'
の代わりに'AND'
と書くことも可能ですが省略可能なので通常は書きません
conditions
連想配列パラメータのキーにconditions
で指定します。
// 条件A かつ (条件B または 条件C)
$this->Reports->find('all',
[
'conditions' => ['id' => $id,
'OR' => ['name <>' => '', 'comment <>' => ''],
],
'order' => ['modified' => 'ASC'],
]);
ANDの場合は以下のように条件を列挙します。
// 条件A かつ 条件B
'conditions' => ['id' => $id, 'name <>' => '']
where
// 条件A または 条件B
$this->Reports->findById($id)
->where(['OR' => ['name <>' => '', 'comment <>' => '']])
->order(['modified' => 'ASC']);
// 条件A かつ 条件B
$this->Reports->findById($id)
->where(['id' => $id, 'name <>' => '']);
複合
'conditions'
とwhere()
両方を使うこともできます。
// 条件A かつ (条件B または 条件C)
$this->Reports->find('all',
[
'conditions' => ['id' => $id]
])
->where(['OR' => ['name <>' => '', 'comment <>' => '']])
->order(['modified' => 'ASC']);
同一カラムのOR
連想配列に同じキーは指定できないので、配列を複数指定します。
'conditions' => [
'OR' => [['category' => '雑記'], ['category' => '仕事']]
]
where([
'OR' => [['category' => '雑記'], ['category' => '仕事']]
])
複数の OR 条件の AND
連想配列に同じキー(OR)は指定できないので、ORの配列を複数指定します。
// (条件A または 条件B) かつ (条件C または 条件D)
'conditions' => [
[
'OR' => [['category' => '雑記'], ['category' => '仕事']]
],
[
'OR' => [['status' => 0], ['status' => 1]]
],
]
// (条件A または 条件B) かつ (条件C または 条件D)
where([
[
'OR' => [['category' => '雑記'], ['category' => '仕事']]
],
[
'OR' => [['status' => 0], ['status' => 1]]
]
])
個人的には、下記のほうが分かりやすいかなと思います。
// (条件A または 条件B) かつ (条件C または 条件D)
->where(['OR' => [['category' => '雑記'], ['category' => '仕事']]])
->where(['OR' => [['status' => 0], ['status' => 1]]])
IN 句
$ids = [1, 2, 5, 9,];
$this->Reports->find('all')
->select(['id'])
->where(['id in' => $ids]);
または
$this->Reports->find('all')
->select(['id'])
->where(function ($exp, $q) {
return $exp->in('id', [1, 2, 5, 9,]);
});
日付時刻
DATETIMEは保存されている書式に合わせて指定します。
$start = date('2019/04/01 00:00:00');
$end = date('2019/04/23 23:59:59');
$query = $this->Reports->find('all')
->where(['created >=' => $start, 'created <=' => $end]);
特定のカラムを選択
デフォルトでは全てのカラムを取得します。必要なカラムだけ欲しい場合は'fields'
を指定、またはselect()
メソッドを使います。
find('all', [
'fields' => ['id', 'name']
])
->select(['id', 'name'])
DISTINCT
重複した行を1行にまとめます。
$this->Reports->find('all')
->select(['id'])
->distinct(['id']);
ORDER BY 句
order()
メソッドを使います。
->order(['created' => 'ASC']);
->order(['category' => 'ASC', 'created' => 'ASC']);