簡體   English   中英

Laravel / Eloquent:嵌套 WhereHas

[英]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();

更新

以下應該為您提供具有所有SkillsWorkers集合。

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM