配列型で取得したデータを使用して下記のような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