【问题标题】:Laravel - How to query if an array field in DB contains a valueLaravel - 如何查询数据库中的数组字段是否包含值
【发布时间】:2017-01-14 06:06:35
【问题描述】:

我的模型Person 中有一个名为jobs 的字段,我将其转换为数组。 jobs 是一个与 Jobs 表相关的 id 数组。我希望能够查询 Person 并返回所有在他们的作业数组中具有特定 id 的人。我看到 Laravel 有一个 whereIn 子句,它检查数据库值是否在数组中,但我需要相反 - 检查数据库数组是否包含值。

我是否坚持使用where('jobs', 'like', '%"' . $job_id . '"%')

【问题讨论】:

    标签: php mysql arrays laravel-5


    【解决方案1】:

    我不确定是否有相反的情况,但是如果您只是想让查询更可重用,您可以通过将其添加到您的 Person 模型来使其成为本地范围:

    /**
     * Scope a query to only include persons with given job id.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeHasJob($query, $jobId)
    {
        return $query->where('jobs', 'like', "%\"{$jobId}\"%");
    }
    

    作用域名称 hasJob 可能会干扰父 QueryBuilder 方法 has,因此您可能必须为它想出一个不同的名称。

    现在您可以使用Person::hasJob($job->id)。但是,与其将工作 ID 作为数组存储在列中,不如考虑创建数据透视表来映射人员与工作之间的关系。您可以使用 php artisan 执行此操作:

    php artisan generate:pivot persons jobs php artisan migrate

    然后你需要将关系添加到你的 Person 模型中:

    /**
     * The person's jobs
     */
    public function jobs()
    {
        return $this->belongsToMany('App\Job');
    }
    

    所以你可以像这样通过 Job 查询你的 Person 模型:

    Person::whereHas('jobs', function ($query) {
        return $query->whereId($job->id);
    });
    

    【讨论】:

    • 不知道generate:pivot函数,很有用!
    【解决方案2】:

    Laravel 包含 whereJsonContains(): 所以你的字段 jobs 你 正在转换为数组,可以查询为:

    ->whereJsonContains('jobs', 3)
    

    这种方式对我有用......

    【讨论】:

    • 非常干净。谢谢。
    • 这只适用于mariaDB这样的数据库服务器,如果你使用mysql,它不支持json
    • 非常感谢您的回答,我在此答案中添加了更多信息数据类型必须匹配:// [1, 2] ->whereJsonContains('players', 1) / / 作品。 ->whereJsonContains('players', '1') // 不起作用。 // ["1", "2"] ->whereJsonContains('players', '1') // 有效。 ->whereJsonContains('players', 1) // 不起作用。礼貌:newbedev.com/php-wherejsoncontains-and-with-laravel-example
    【解决方案3】:

    您可以使用类似这样的查询。

    $k = ["359045532","359079612","359079372","359081292","359081052","359086332","359086092","359111892","359111652"];
    
    Modal::whereIn('myitems', $k)->get(); 
    

    【讨论】:

      【解决方案4】:
      <!-- If you have a collection of value like this: --> 
      

      $category_id = 1,2,3,...; $category_id = $_POST['category_id'];

      $myArray = explode(',', $category_id); 
      
      <!-- If you already have array data you can pass this to the following query -->
      $data = DB::table('tablename')->select('*') ->whereIn('catcode', $myArray)->get();
      

      【讨论】:

      • 在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他有类似问题的用户有用。
      • laravel 中的$_POST 是什么?为什么在 Laravel 已经有 Request 获取 Get / Post 表单值的情况下使用 php 核心函数。
      【解决方案5】:

      我正在向 Zubayer Hossain 的回答添加更多信息

      The data types have to match:
      // [1, 2]
      ->whereJsonContains('players', 1)   // Works.
      ->whereJsonContains('players', '1') // Doesn't work.
      
      // ["1", "2"]
      ->whereJsonContains('players', '1') // Works.
      ->whereJsonContains('players', 1)   // Doesn't work. 
                                                                            
      

      whereJsonContains 可用于我们需要检查值是否与表中的 json 编码字段匹配的情况。

      礼貌:https://newbedev.com/php-wherejsoncontains-and-with-laravel-example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 2019-09-22
        • 2018-11-14
        • 1970-01-01
        • 2014-12-05
        • 2018-07-25
        • 2020-03-29
        相关资源
        最近更新 更多