このようなテーブルがあります:
table
- field1: tinyint
- field2: varchar (nullable)
- datefield: timestamp (nullable)
ここで、field1が1、field2がnullで、datefieldがXまたはnullより小さいすべてのエントリを取得したい。私はすでにこのようなことを試しました:
$query = Model::where('field1', 1)
->whereNull('field2')
->where('datefield', '<', $date)
->orWhereNull('datefield');
しかし、それは機能しません。 datefieldがnullのすべてのエントリを常に取得します。他のフィールドが何であるかは関係ありません。また、2つのクエリに分割しようとしました:最初にdatefieldがXまたはnullより小さいすべての行を取得し、次に(それに基づいて)field1が1でfield2がnullのすべてのフィールドを取得します。
結果は同じでした。これを行う方法はありますか?
高度なwhere句 を使用する必要があるようです。
field1
およびfield2
での検索は一定であるため、そのままにしておきますが、datefield
での検索を少し調整します。
これを試して:
$query = Model::where('field1', 1)
->whereNull('field2')
->where(function ($query) {
$query->where('datefield', '<', $date)
->orWhereNull('datefield');
}
);
クエリをデバッグして、なぜ機能しないのかを確認する必要がある場合、実際に実行されているSQLを確認するのに役立ちます。 ->toSql()
を雄弁なクエリの末尾にチェーンして、SQLを生成できます。
2つのクエリをマージできます。
$merged = $query_one->merge($query_two);