【问题标题】:Laravel whereIn implementation of whereJsonContainsLaravel whereIn 实现 whereJsonContains
【发布时间】:2020-12-08 11:55:09
【问题描述】:

我的代码可以正常工作并返回 1 个项目集合:

$myCollection = MyModel::whereJsonContains('payload->ProductCode->id', "1")->get();

然而,我想获取 $myCollection 不仅是在值为 1 时,而是在它包含在多个数组项之一中时。

 $array = [0 => 1, 1 => 2, 2 => 3];
 $myCollection = MyModel::whereJsonContains('payload->ProductCode->id', $array)->get();
 

更新 当我尝试此代码时,它返回一个空数据。我的意思是当我使用 1 而不是 "1" 时。这可能是我使用数组时它不起作用的原因吗?

$myCollection = MyModel::whereJsonContains('payload->ProductCode->id', 1)->get();

有效载荷包含的示例如下。我想这可以更清楚地说明我的问题:

{
    "ProductCode": {
        "id": "1",
        "name": "My Service",
    }
    
}

运行上面的代码会返回一个空数据。请问如何解决这个问题?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您需要按照以下方式进行查询。

    $array = [0 => 1, 1 => 2, 2 => 3];
    
    // Eloquent
    PaymentTransaction::whereJsonContains('payload->ProductCode->id',$array)->get();;
    
     // or
    PaymentTransaction::jsonContains('payload->ProductCode->id', $array)->get();
    

    你也可以尝试如下。

    $array = [0 => 1, 1 => 2, 2 => 3];
    $array = array_values(array_map('strval',$array));
    PaymentTransaction::where(function ($query) use ($array) {
       foreach ($array as $id) {
           $query->orWhereJsonContains('payload->ProductCode->id', $id);
       }
    })->get();
    

    【讨论】:

      【解决方案2】:

      我认为@Dilip 答案的第一部分不正确,因为我在 laravel 8 上与whereJsonContains 有同样的问题。如果该字段不是 JSON 数组,它将返回空结果。他回答的第二部分解决了问题,但没有在此处指出问题。

      whereJsonContains 方法用于查询JSON array fields,在您的情况下,payload->ProductCode->id 不是数组字段。这就是你得到空数组的原因。

      现在,当您正在查找 payload->ProductCode->id 包含在您的 $array 中的行时,whereIn 方法就是您要查找的方法。 正如 Laravel 文档所说,“whereIn 方法验证给定列的值是否包含在给定数组中”。所以你的代码会是这样的:

      $array = [ 1, 2, 3];
      $myCollection = MyModel::whereIn('payload->ProductCode->id', $array)->get();
      
      // $myCollection contains rows that their `payload->ProductCode->id` is contained within [1, 2, 3] array.
      

      如果您的数据是这样的,您可以使用whereJsonContains 方法:

      {
          "ProductCode": {
              "id": ["1", "2"],
              "name": "My Service",
          }
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 2014-05-10
        • 2019-01-03
        • 1970-01-01
        • 2018-09-27
        • 2017-05-30
        • 2019-11-06
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多