Laravel Eloquent,其中字段为 X 或 null
Posted
技术标签:
【中文标题】Laravel Eloquent,其中字段为 X 或 null【英文标题】:Laravel Eloquent where field is X or null 【发布时间】:2016-07-22 04:09:27 【问题描述】:我有一张这样的桌子:
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 为空的每个条目。其他字段是什么并不重要。我还尝试将其拆分为 2 个查询:首先获取 datefield 小于 X 或 null 的每一行,然后(基于此)获取 field1 为 1 且 field2 为 null 的每个字段。
结果是一样的。 知道怎么做吗?
【问题讨论】:
【参考方案1】:听起来你需要使用advanced where clauses。
鉴于在 field1
和 field2
中的搜索是不变的,我们将保持原样,但我们将稍微调整您在 datefield
中的搜索。
试试这个:
$query = Model::where('field1', 1)
->whereNull('field2')
->where(function ($query)
$query->where('datefield', '<', $date)
->orWhereNull('datefield');
);
如果您需要调试一个查询并查看它为什么不工作,它可以帮助您查看它实际执行的 SQL。您可以将 ->toSql()
链接到 eloquent 查询的末尾以生成 SQL。
【讨论】:
这让我有些沮丧!谢谢。 可以通过以下方式完成: whereIn('column',['value',null]) ? @MASh 不确定。我很久以前写过这篇文章,这是当时最好的方法。为什么不试一试呢? 我使用你这里写的方法正常。试过了,它没有从数据库中获取任何信息。可能是数据库引擎对待 null 与 value 不同。我想知道是否有办法在数组中传递 null。 @MASh:是的,数据库对值和 NULL 的处理方式不同(字符串“null”是正常值)。比较值的正常条件具有定义的结果。对 NULL 的比较是未定义的,因为 NULL 代表未知的事物,并且将值与未知的事物进行比较不会导致结果。要检查查询中的某些内容是否为 NULL,请使用 "IS" -> "where field1 IS NULL"【参考方案2】:您可以将两个查询合并在一起:
$merged = $query_one->merge($query_two);
【讨论】:
【参考方案3】:使用 coalesce() 将 null 转换为 0:
$query = Model::where('field1', 1)
->whereNull('field2')
->where(DB::raw('COALESCE(datefield_at,0)'), '<', $date)
;
【讨论】:
以上是关于Laravel Eloquent,其中字段为 X 或 null的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent:如果搜索文本字段为空,如何显示所有行
Laravel Eloquent 按字段排序为 1,2,3,4,1,2,3,4
PHP Laravel - Eloquent 在调用方法 json 时随机返回布尔字段,有时为 0 1,其他为 true false