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']);
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

スポンサードリンク

関連コンテンツ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です