[英]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 子句。
鑒於field1
和field2
中的搜索是恆定的,我們將保持原樣,但我們將稍微調整您在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.