【问题标题】:Laravel Eloquent where field is X or nullLaravel Eloquent,其中字段为 X 或 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 的每个字段。

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

【问题讨论】:

    标签: php laravel eloquent


    【解决方案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)
      ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-05
        • 2016-08-12
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2014-07-30
        相关资源
        最近更新 更多