便利になったんだろうけど、最初の壁は乗り越えづらい。
ちとハマったので、昔みたいに軽くメモ。
cakephp3.xはquery builderが一新されている。色々方法があるとは思うが、情報探すの大変。
一番はリファレンスを見ることがだが、基礎なので、応用を考えなければいけない。
「これって、こうだから、こんなこともいけるんじゃね?」みたいな発想(?)と試してみるべし。
話戻るけど、下記条件のqueryを実行したかった。
既存のデータから、とある日付 and とあるユーザー and (between 開始時刻 ユーザーが入力した情報1 and ユーザーが入力した情報2 or between 終了時刻 ユーザーが入力した情報1 and ユーザーが入力した情報2)
みたいなquery(わかりづらいな・・・)
1つの条件ならwhere
を使えばすぐできそうだが、複雑になるとどうやるかわからなかった。
とりあえず、リファンレスに書いてあることを、試し試しでやっていたらできたのでメモ。@
<?php // ... public static function existsDatetime($date, $userId, $start, $end) { $tableName = TableRegistry::get('table_name'); $query = $tableName->find('all') ->where(function ($exp) use ($date, $start, $end, $userId) { // (between or between)を作っている $orConditions = $exp->or_(function ($or) use ($start, $end) { return $or->between('start_time', $start, $end) ->between('end_time', $start, $end); }); // orは`$exp->or_()`で作らないといけないが // andはメソッドチェーンすればandとなる return $exp->add($orConditions) ->eq('my_date', $date) ->eq('user_id', $userId); }); $count = $query->count(); return !(boolean)$count; } // ...
↑のコードはバリデーションクラスで使ったので、バリデーションのこともまたいつか書こうと思う。
無名関数を使えば、色々な表現方法を使ってqueryを生成できそうだ。便利。
これでできた。( ´ー`)フゥー...