2016-09-06 30 views
2

我在我的模型Person中有一個字段,名爲jobs,我將其轉換爲數組。 jobs是與作業表相關的ID數組。我希望能夠查詢Person並返回所有在他們的作業數組中有特定ID的內容。我看到Laravel有一個whereIn子句,用於檢查數據庫值是否在數組中,但我需要相反的方法 - 檢查數據庫數組是否包含值。Laravel - 如何查詢數組中的數組字段是否包含值

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

回答

4

我不知道有一個相反然而,如果你只是希望使查詢了一下更具可重用性,你可以通過添加給你的人的模型,使其局部範圍:

/** 
* 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工匠:

php artisan generate:pivot persons jobs php artisan migrate

然後,你需要的關係添加到您的Person模型:

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

所以,你可以通過這樣的招聘查詢您的Person模型:

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