Laravel Eloquent,其中字段为X或null

时间:2016-04-02 09:58:19

标签: php laravel eloquent

我有一张这样的表:

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的每个字段。

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

3 个答案:

答案 0 :(得分:81)

听起来你需要使用advanced where clauses

鉴于field1field2中的搜索不变,我们会保留原样,但我们会稍稍调整您的搜索{/ 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)
;