我有一张这样的表:
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的每个字段。
结果是一样的。 知道怎么做吗?
答案 0 :(得分:81)
听起来你需要使用advanced where clauses。
鉴于field1
和field2
中的搜索不变,我们会保留原样,但我们会稍稍调整您的搜索{/ 1}}。
试试这个:
datefield
如果您需要调试查询并查看它无法正常工作的原因,可以帮助查看它实际执行的SQL。您可以将$query = Model::where('field1', 1)
->whereNull('field2')
->where(function ($query) {
$query->where('datefield', '<', $date)
->orWhereNull('datefield');
}
);
链接到您的eloquent查询的末尾以生成SQL。
答案 1 :(得分:1)
您可以将两个查询合并在一起:
$merged = $query_one->merge($query_two);
答案 2 :(得分:1)
使用coalesce()将null转换为0:
$query = Model::where('field1', 1)
->whereNull('field2')
->where(DB::raw('COALESCE(datefield_at,0)'), '<', $date)
;