簡體   English   中英

Laravel Eloquent 其中字段為 X 或 null

[英]Laravel Eloquent where field is X or 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');

但那是行不通的。 我總是得到日期字段為 null 的每個條目。其他字段是什么並不重要。 我還嘗試將其拆分為 2 個查詢:首先獲取 datefield 小於 X 或 null 的每一行,然后(基於它)獲取 field1 為 1 且 field2 為 null 的每個字段。

結果是一樣的。 知道怎么做嗎?

聽起來您需要使用高級 where 子句

鑒於field1field2中的搜索是恆定的,我們將保持原樣,但我們將稍微調整您在datefield的搜索。

試試這個:

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

如果您需要調試查詢並查看它為什么不起作用,那么查看它實際執行的 SQL 會有所幫助。 您可以將->toSql()到雄辯查詢的末尾以生成 SQL。

您可以將兩個查詢合並在一起:

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

使用 coalesce() 將 null 轉換為 0:

$query = Model::where('field1', 1)
    ->whereNull('field2')
    ->where(DB::raw('COALESCE(datefield_at,0)'), '<', $date)
;

如果您對將獲取集合或單行的 get()/first() 放在哪里感到困惑,方法如下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM