我刚刚开始学习Laravel,偶然发现了一个问题,我无法使用雄辩的关系来工作。
假设我有一个工作者模型、一个技能模型和一个数据透视表skills_workers来保持多对多关系。当我试图得到所有的工人,他们具有以下技能,那么使用以下语法是没有问题的:
$skill='carpenter';
$workers=Worker::whereHas('skills', function (Builder $query) use($skill){
$query->where('name','=',$skill);
})->get()();当我需要找到所有拥有这套技能的工人时,问题就开始了。例如,carpenter-driver-chef (仅举个例子)。如果工人应该拥有其中一项技能,那么我只需要使用whereIn函数,但我需要找到在数组中拥有所有技能的工人。我不能创建嵌套的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查询。提前谢谢你
发布于 2021-06-06 19:08:06
由于您的$skills变量看起来是一个数组,因此您可以使用雄辩的whereIn函数。
$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();发布于 2021-06-06 18:49:09
我认为你可以使用foreach来获取多个匹配条件。
$workers=Worker::whereHas('skills', function (Builder $query) use($skills){
foreach($skills as $value){
$query->where('name',$value);
}
})->get();发布于 2021-06-06 20:05:31
您可以从获取所有skills开始,然后可以像这样使用whereIn
$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(); https://stackoverflow.com/questions/67858221
复制相似问题