php - Laravel 使用 Eloquent 进行多对多选择

标签 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_id 是不同的技能,每个返回的用户都应该具有所需级别的每个给定技能。

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

最佳答案

你需要的是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();

关于php - Laravel 使用 Eloquent 进行多对多选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27675359/

相关文章:

mysql - 在 Laravel 中将 JSON 对象保存到 MySQL 数据库中

laravel - 如何使用 Eloquent 平均多列?

php - mysql_query 返回错误,但在 phpmyadmin 中不返回错误

php - 如何确保我的查询插入新行?

java - 如何使用hibernate连接四个表

php - 如何 "keep"codeigniter activerecord状态

php - Crypt() 用户 ID 为字母数字,用于 API 请求 URL

php - Laravel 5.6 向用户注册角色

php - 如何在 PHP 中从文件目录获取图像属性

mysql - 如何在mysql中为远程用户授予SUPER权限?