Php Laravel/雄辩:嵌套在何处

Php Laravel/雄辩:嵌套在何处,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我刚刚开始学习拉威尔,偶然发现了一个问题,我无法用雄辩的人际关系解决这个问题 假设我有一个工人模型、一个技能模型和一个数据透视表skills\u workers来保持多对多关系。 当我试图让所有具有以下技能的工人都参与进来时,使用以下语法是毫无问题的: $skill='carpenter'; $workers=Worker::whereHas('skills', function (Builder $query) use($skill){ $query-

我刚刚开始学习拉威尔,偶然发现了一个问题,我无法用雄辩的人际关系解决这个问题

假设我有一个工人模型、一个技能模型和一个数据透视表skills\u workers来保持多对多关系。 当我试图让所有具有以下技能的工人都参与进来时,使用以下语法是毫无问题的:

    $skill='carpenter';

    $workers=Worker::whereHas('skills', function (Builder $query) use($skill){
            $query->where('name','=',$skill);
    })->get()();
当我需要找到所有具备这套技能的工人时,问题就开始了。例如,木匠司机厨师(仅举个例子)。如果工人应该拥有其中一项技能,那么我只需要使用where函数,但我需要找到在数组中拥有所有技能的工人。 我无法创建嵌套的WhereHas,因为每次用户执行搜索时,技能集可能会有所不同。有时只是一种技能,有时是两种,依此类推。 因此,以下结构:

    $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查询。
提前感谢您

我认为您可以使用foreach for skills获得多个匹配条件

   $workers=Worker::whereHas('skills', function (Builder $query) use($skills){
               foreach($skills as $value){
            $query->where('name',$value);
         }
                
    
        })->get();

由于
$skills
变量似乎是一个数组,因此可以使用雄辩的
where
函数

$workers=Worker::whereHas('skills',函数(Builder$query)use($skills){
$query->where('name',$skills);
})->get();
更新

以下内容将为您提供一组拥有所有
技能的
员工

$workers=Worker::whereHas('skills');
foreach($skills作为$skill){
$workers->whereHas('skills',函数(Builder$query)use($skill){
$query->where('name',$skill);
})->get();
}
$workers->get();

你可以从获得所有
技能开始,然后你可以像这样使用

$skills=['carpenter','driver'];

$skills_id = Skill::whereIn(['name',$skills])->pluck('id');
通过使用
pluck
查询将返回一个ID数组
[1,3,…]
非模型

$workers = Worker::whereHas('skills', function(Builder $query) use ($skills_id) {
    $query->whereIn('id', $skills_id);
})->get(); 

不幸的是,where是一个“Or”,所以在我的例子中,它会找到所有拥有“木匠”技能的工人和所有拥有“司机”技能的工人,但不是同时拥有这两种技能的工人,非常感谢!它正在工作!我需要一些时间来理解它到底是如何工作的,尽管它确实工作得很好!不,因为skills_worker pivot表在一条记录中只有一项技能,所以这样的构造不会产生任何结果。如果我正确理解您的问题,您需要技能与$skills Rights传递的所有技能匹配的工人列表是的,的确如此。若工人和技能表之间存在直接联系,那个么你们的解决方案就会奏效。然而,在这种情况下,它是这样做的:1)它在pivot表中找到具有第一项技能的记录2)之后,它检查同一条记录是否也包含第二项技能。但是记录总是只包含一项技能,所以不会有任何结果,不幸的是…你能发布一些数据和你期望的结果吗?这样我们就可以检查它看起来怎么样了,约翰,但是@Peppermintology已经给出了有效的解决方案。希望它也能帮助其他有同样问题的人。和上面一样,where作为“Or”起作用,所以在我的例子中,它会找到所有的“carpenters”和所有的“drivers”,但不是所有的“carpenters,who是drivers”…是否仅检索同时为
木匠
司机
的工人,或检索所有案例仅检索同时为“木匠”和“司机”的工人,而不是检索所有案例