Laravel很多人都选择了Eloquent

时间:2014-12-28 09:59:17

标签: php mysql laravel laravel-4

我有2个表,用户和技能,以及它们之间的多对多关系。数据透视表skill_user也有列'等级' - 该用户知道此技能的级别。

在用户模型中我有:

public function skills(){
    return $this->belongsToMany('Skill')->withPivot('level');
}

并在技能模型中:

public function users(){
    return $this->belongsToMany('User');
}

现在,我需要运行一个返回类似的查询:

"选择具有skill_id_1>的所有用户40&& skill_id_2> 55&& skill_id_3> 67"

其中skill_ids是不同的技能,每个返回的用户应该具有所需级别的每个技能。

我尽可能多地在Laravel文档和stackoverflow中搜索,但无法找到解决方案。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:5)

您需要的是whereHas。多个。

$users = User::whereHas('skills', function($q){
    $q->where('skill_id', 1);
    $q->where('level', '>', 44);
})->whereHas('skills', function($q){
    $q->where('skill_id', 2);
    $q->where('level', '>', 55);
})->whereHas('skills', function($q){
    $q->where('skill_id', 3);
    $q->where('level', '>', 67);
})->get();

我假设这些值是动态的,所以这应该简化它:

$requirements = array('1' => 40, '2' => 55, '3' => 67);

$users = User::query();
foreach($requirements as $id => $value){
    $users->whereHas('skills', function($q) use ($id, $value){
        $q->where('skill_id', $id);
        $q->where('level', '>', $value);
    });
}
$users = $users->get();