我的模型Person
中有一个名为jobs
的字段,我将其作为数组进行投射。 jobs
是与Jobs表相关的id数组。我希望能够查询Person并返回其作业数组中具有特定id的所有内容。我看到Laravel有一个whereIn
子句,它检查数据库值是否在数组中,但我需要相反 - 检查数据库数组是否包含值。
我是否不得不使用where('jobs', 'like', '%"' . $job_id . '"%')
?
答案 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();