php - 使用 Eloquent 进行一些复杂的查询

标签 php mysql laravel laravel-5 eloquent

我正在尝试学习 laravel,目前正在使用 Eloquent 与数据库进行交互。我一直在思考如何使用 Eloquent 来加入 Eloquent。

我有两个表之间的多对多关系:用户和项目,我使用 sharedProject 表作为中间表。

表格是这样的

用户:

| iduser | name       | password       |
----------------------------------------
|  1     | somename   | hashPassword   |
|  2     | somename2  | hashPassword   |
|  3     | somename3  | hashPassword   |
|  4     | somename4  | hashPassword   |
----------------------------------------

项目:

| pid | projectname
-------------------
|  1  | somename
|  2  | somename

共享项目:

| pid | iduser | sharedProjectid | 
----------------------------------
|  1  |  1     |       1         |
|  1  |  2     |       2         |

现在我想获取所有未共享给定项目的用户,例如在上述情况下,对于 id 为 1 的项目,我应该获取用户 3 和用户 4。

这是我在用户模型中的关系

  /**
     * User can have many projects
     *
     * @var array
     */
    public function projects(){
        return $this->hasMany('App\Project','pid','iduser'); // hasmany(model,foreignkey,localkey)
    }


    /**
     * The user can have many shared projects
     */
    public function sharedProjects()
    {

        return $this->belongsToMany('App\SharedProject', 'sharedProjects', 'iduser', 'pid');//  belongsToMany('intermediate tablename','id1','id2')
    }

在项目模型中:

     /**
         * The project can be shared by many users
         */
        public function sharedProjects()
        {

            return $this->belongsToMany('App\SharedProject', 'sharedProjects', 'pid', 'iduser');//  belongsToMany('intermediate tablename','id1','id2')
        }
 /**
     * a project belongs to a single user
     *
     * @var array
     */
     public function user()
    {
        return $this->belongsTo('App\User');
    }

我更喜欢一种 Eloquent 方式来做到这一点,但也希望它除外,如果不能以 Eloquent 方式完成并且我必须看到另一种方法,我也希望使用普通的 mysql 查询。

谢谢

最佳答案

一旦您定义了 Eloquent 模型和多对多关系,您就可以使用它们来获取您正在寻找的数据。

假设 User 模型定义了 projects 关系,您可以使用 whereDoesntHave() 方法查询用户列表与特定项目无关。

$projectId = 1;
$users = User::whereDoesntHave('projects', function ($q) use ($projectId) {
        return $q->where('projects.id', $id);
    })->get();

您可以在 Eloquent 中阅读有关定义多对多关系的信息 here .

您可以阅读查询关系是否存在 here .

您可能会注意到,并非所有方法都记录在案(如 whereDoesntHave()),因此您可能需要深入研究源代码。您可以深入 Eloquent 代码库 here .

关于php - 使用 Eloquent 进行一些复杂的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421890/

相关文章:

php - 以 html 形式更新一个依赖于另一个表的表值

php - PHP MySQL 错误

php - 打开网站时CodeIgniter数据库错误

php - 无法更新 mysql 数据库的特定列

mysql - 查询,联接和求和问题,返回错误

mysql - 如何在 Eloquent Query Builder (Laravel 4) 中按 "SUM"排序

php - Symfony 验证

mysql - 如何在mysql存储过程中循环日期时间

mysql - 选择相似的 IP 地址 - 忽略最后 3 位数字

javascript - Jquery 获取 url id