Laravel - 如何查询DB中的数组字段是否包含值

时间:2016-09-06 17:35:19

标签: php mysql arrays laravel-5

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

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

3 个答案:

答案 0 :(得分:5)

我不确定是否存在相反的情况但是如果您只是想让查询更具可重用性,可以通过将其添加到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);
});

答案 1 :(得分:2)

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

->whereJsonContains('jobs', 3)

那样对我有用...

答案 2 :(得分:0)

<!-- If you have a collection of variable like this: --> $category_id = 1,2,3,...;
$category_id = $_POST['category_id'];

<!--following function used to conver as an array -->
$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();