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。

鉴于在 field1field2 中的搜索是不变的,我们将保持原样,但我们将稍微调整您在 datefield 中的搜索。

试试这个:

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

如果您需要调试一个查询并查看它为什么不工作,它可以帮助您查看它实际执行的 SQL。您可以将 -&gt;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

Laravel Eloquent:返回数组键作为字段 ID

Laravel Eloquent 特定列错误

Laravel Eloquent与逗号分隔字段的关系