web-dev-qa-db-ja.com

LaravelフィールドがXまたはnullである雄弁

このようなテーブルがあります:

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のすべてのフィールドを取得します。

結果は同じでした。これを行う方法はありますか?

48
festie

高度なwhere句 を使用する必要があるようです。

field1およびfield2での検索は一定であるため、そのままにしておきますが、datefieldでの検索を少し調整します。

これを試して:

$query = Model::where('field1', 1)
    ->whereNull('field2')
    ->where(function ($query) {
        $query->where('datefield', '<', $date)
            ->orWhereNull('datefield');
    }
);

クエリをデバッグして、なぜ機能しないのかを確認する必要がある場合、実際に実行されているSQLを確認するのに役立ちます。 ->toSql()を雄弁なクエリの末尾にチェーンして、SQLを生成できます。

99
James

2つのクエリをマージできます。

$merged = $query_one->merge($query_two);
2
kaleazy