首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel / Eloquent:嵌套WhereHas

Laravel / Eloquent:嵌套WhereHas
EN

Stack Overflow用户
提问于 2021-06-06 18:44:11
回答 3查看 95关注 0票数 1

我刚刚开始学习Laravel,偶然发现了一个问题,我无法使用雄辩的关系来工作。

假设我有一个工作者模型、一个技能模型和一个数据透视表skills_workers来保持多对多关系。当我试图得到所有的工人,他们具有以下技能,那么使用以下语法是没有问题的:

代码语言:javascript
复制
    $skill='carpenter';

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

当我需要找到所有拥有这套技能的工人时,问题就开始了。例如,carpenter-driver-chef (仅举个例子)。如果工人应该拥有其中一项技能,那么我只需要使用whereIn函数,但我需要找到在数组中拥有所有技能的工人。我不能创建嵌套的WhereHas,因为每次用户执行搜索时,技能集都可能不同。有时只有一种技能,有时只有两种技能,以此类推。因此,下面的结构:

代码语言:javascript
复制
    $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查询。提前谢谢你

EN

回答 3

Stack Overflow用户

发布于 2021-06-06 19:08:06

由于您的$skills变量看起来是一个数组,因此您可以使用雄辩的whereIn函数。

代码语言:javascript
复制
$workers = Worker::whereHas('skills', function (Builder $query) use ($skills) {
    $query->whereIn('name', $skills);
})->get();

更新

下面的代码应该会为您提供一个包含所有SkillsWorkers集合。

代码语言:javascript
复制
$workers = Worker::whereHas('skills');

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

$workers->get();
票数 1
EN

Stack Overflow用户

发布于 2021-06-06 18:49:09

我认为你可以使用foreach来获取多个匹配条件。

代码语言:javascript
复制
   $workers=Worker::whereHas('skills', function (Builder $query) use($skills){
               foreach($skills as $value){
            $query->where('name',$value);
         }
                
    
        })->get();
票数 0
EN

Stack Overflow用户

发布于 2021-06-06 20:05:31

您可以从获取所有skills开始,然后可以像这样使用whereIn

代码语言:javascript
复制
$skills=['carpenter','driver'];

$skills_id = Skill::whereIn(['name',$skills])->pluck('id');

通过使用pluck,查询将返回一个ID数组,而不是[1,3,...]

代码语言:javascript
复制
$workers = Worker::whereHas('skills', function(Builder $query) use ($skills_id) {
    $query->whereIn('id', $skills_id);
})->get(); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67858221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档