Laravel Eloquent 其中字段为 X 或 null

2022-08-30 07:32:43

我有一个这样的表:

table
- field1: tinyint
- field2: varchar (nullable)
- datefield: timestamp (nullable)

现在我想获取字段 1 为 1、字段 2 为空且日期字段小于 X 或 null 的所有条目。我已经尝试过这样的东西:

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

但这行不通。我总是得到每个日期字段为空的条目。其他字段是什么并不重要。我还尝试将其拆分为2个查询:首先获取日期字段小于X或null的每一行,然后(基于它)获取field1为1,field2为null的每个字段。

结果是一样的。任何想法如何做到这一点?


答案 1

听起来你需要使用高级 where 子句

鉴于搜索是恒定的,我们将保持原样,但我们将在一点点调整您的搜索。field1field2datefield

试试这个:

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

如果您需要调试查询并查看其不起作用的原因,则有助于了解它实际执行的SQL。您可以链接到雄辩查询的末尾以生成 SQL。->toSql()


答案 2

您可以将两个查询合并在一起:

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

推荐