2016-09-06 11 views
2

私はモデルとしてPersonというフィールドを持っていて、配列としてキャストするのはjobsです。 jobsは、ジョブテーブルに関連するIDの配列です。 Personに問い合わせを行い、jobs配列内の特定のIDを持つすべてを返すことができるようにしたい。 LaravelにはwhereIn節があり、データベースの値が配列に含まれているかどうかを確認しますが、逆にする必要があります。データベース配列に値が含まれているかどうかを確認する必要があります。Laravel - DBの配列フィールドに値が含まれているかどうかを問い合わせる方法

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

を次に、あなたの個人モデルに関係を追加する必要があります。

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

ですから、このような仕事であなたのPersonモデルを照会することができます:

Person::whereHas('jobs', function ($query) { 
    return $query->whereId($job->id); 
}); 
関連する問題