[英]Laravel / Eloquent: nested WhereHas
我剛剛開始學習 Laravel 並偶然發現了一個我無法使用 Eloquent 關系解決的問題。
假設我有一個 Worker model、一個 Skill model 和一個 pivot 表 Skills_workers 來保持多對多關系。 當我試圖讓所有具有以下技能的工人時,使用以下語法就沒有問題了:
$skill='carpenter';
$workers=Worker::whereHas('skills', function (Builder $query) use($skill){
$query->where('name','=',$skill);
})->get()();
當我需要找到所有具備這些技能的工人時,問題就開始了。 例如,木匠-司機-廚師(僅作為示例)。 如果工人應該具備其中一項技能,那么我只需使用 whereIn function,但我需要找到擁有所有技能的工人。 我無法制作嵌套的 WhereHas,因為每次用戶執行搜索時,技能集可能會有所不同。 有時只有1個技能,有時是2個,依此類推。 所以下面的構造:
$skills=['carpenter','driver'];
$workers=Worker::whereHas('skills', function (Builder $query) use($skills){
$query->where('name','=',$skills[0]);
})->whereHas('skills', function (Builder $query) use($skills){
$query->where('name','=',$skills[1]);
})->get();
不是一種選擇。
例如,有沒有辦法在 foreach 循環中使用 whereHas ? 或者,也許有一種更優雅的方式來執行此類查詢? 我發現的 StackOverflow 上的其他帖子都沒有幫助......如果可能的話,我真的很想避免使用原始的 SQL 查詢。 先感謝您
由於您的$skills
變量似乎是一個數組,您可以使用 Eloquent whereIn
function。
$workers = Worker::whereHas('skills', function (Builder $query) use ($skills) {
$query->whereIn('name', $skills);
})->get();
更新
以下應該為您提供具有所有Skills
的Workers
集合。
$workers = Worker::whereHas('skills');
foreach ($skills as $skill) {
$workers->whereHas('skills', function (Builder $query) use ($skill) {
$query->where('name', $skill);
})->get();
}
$workers->get();
我認為您可以使用 foreach 技能來獲得多個匹配條件
$workers=Worker::whereHas('skills', function (Builder $query) use($skills){
foreach($skills as $value){
$query->where('name',$value);
}
})->get();
您可以從獲得所有skills
開始,之后您可以像這樣使用whereIn
$skills=['carpenter','driver'];
$skills_id = Skill::whereIn(['name',$skills])->pluck('id');
通過使用pluck
查詢將返回一個 ID 數組[1,3,...]
而不是 model。
$workers = Worker::whereHas('skills', function(Builder $query) use ($skills_id) {
$query->whereIn('id', $skills_id);
})->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.