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

Bri*_*ves 3 php mysql arrays laravel-5

我的模型中有一个字段Person叫做jobs我正在铸造成一个数组.jobs是一个与Jobs表相关的id数组.我希望能够查询Person并返回其job数组中具有特定id的所有内容.我看到Laravel有一个whereIn子句检查数据库值是否在数组中,但我需要相反 - 检查数据库数组是否包含值.

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

Zub*_*ain 18

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

->whereJsonContains('jobs', 3)
Run Code Online (Sandbox Code Playgroud)

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

  • MySQL 5.7+ 支持此功能,https://laravel.com/docs/8.x/queries#json-where-clauses (2认同)

Cal*_*lam 8

我不确定是否存在相反的情况但是如果您只是希望使查询更具可重用性,可以通过将其添加到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}\"%");
}
Run Code Online (Sandbox Code Playgroud)

范围的名称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');
}
Run Code Online (Sandbox Code Playgroud)

所以你可以通过Job查询你的Person模型,如下所示:

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