読者です 読者をやめる 読者になる 読者になる

たなちの開発日誌

プログラミングのメモを中心に気になったことを書いていきます。

【CakePHP3】 クエリビルダ Where句でand,or条件の組み合わせ

配列型で取得したデータを使用して下記のようなSQL文を作りたい。

Where(
   (条件1 and 条件2)
or (条件3 and 条件4)
or (条件3 and 条件4)
…
)

次の2種類の書き方がある。

orWhere()とand_()を組み合わせる方法

orWhere句でor条件の連結ができるが、クロージャで明示的にand条件を指定しないと
条件1 or 条件2 or …となる。
and_()でand条件を明示的に指定。

<?php

$query = $this->Maps->find();
for ($i = 0; $i < count($prefecture); $i++) {
    $query->orWhere(function ($exp, $query) use ($prefecture, $city, $i) {
        return $exp->and_([
            'Maps.prefecture_name' => $prefecture[$i],
            'Maps.city_name LIKE'  => $city[$i]
        ]);
    });
}

クロージャという単語の解説はこのサイトがわかりやすい。
自分も知らなかったけど関数内の関数、で受けた変数を操作できるとのこと。
なぜクロージャ(Closure)と言うのか? - Qiita

配列に条件を追加してwhereに渡す方法

ループを回すごとにor句になる

<?php

$query = $this->Maps->find();
$conditions = [];
for ($i = 0; $i < count($prefecture); $i++) {
    $conditions['OR'][] = [
        'Maps.prefecture_name' => $prefecture[$i],
        'Maps.city_name LIKE'  => $city[$i]
    ];
}
$query->where($conditions);

cookbookの参考ページ:http://book.cakephp.org/3.0/ja/orm/query-builder.html#sql