Laravel Eloquent,其中字段为X或null

fes*_*tie 50 php laravel eloquent

我有这样一张桌子:

table
- field1: tinyint
- field2: varchar (nullable)
- datefield: timestamp (nullable)
Run Code Online (Sandbox Code Playgroud)

现在我想得到所有条目,其中field1为1,field2为null,其中datefield小于X或null.我已经尝试过这样的事:

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

但那不起作用.我总是得到datefield为null的每个条目.其他领域是什么并不重要.我还尝试将它分成2个查询:首先获取datefield小于X或null的每一行然后(基于它)获取field1为1且field2为null的每个字段.

结果是一样的.知道怎么做吗?

Jam*_*mes 104

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

鉴于搜索field1并且field2是不变的,我们将按原样保留它们,但我们将datefield稍微调整您的搜索.

试试这个:

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

如果您需要调试查询并查看它无法正常工作的原因,则可以帮助查看它实际执行的SQL.您可以链接->toSql()到您的eloquent查询的末尾以生成SQL.

  • 这使我免于沮丧!谢谢。 (3认同)

kal*_*azy 6

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

$merged = $query_one->merge($query_two);
Run Code Online (Sandbox Code Playgroud)