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

ITの隊長のブログ

ITの隊長のブログです。PythonとRを使って仕事しています。最近は機械学習をさわりはじめたお(^ω^ = ^ω^)

【CakePHP3.x】query builderを使った複数条件のwhere

スポンサードリンク

便利になったんだろうけど、最初の壁は乗り越えづらい。

ちとハマったので、昔みたいに軽くメモ。

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を生成できそうだ。便利。

これでできた。( ´ー`)フゥー...