【问题标题】:A little complex query using eloquent使用 eloquent 的一个有点复杂的查询
【发布时间】:2016-09-10 02:19:49
【问题描述】:

我正在尝试学习 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');
    }

我更喜欢一种雄辩的方式来做到这一点,但如果不能以雄辩的方式完成,我也希望看到另一种方法,我也会欣赏一个普通的 mysql 查询。

谢谢

【问题讨论】:

  • 很高兴有你的表格数据,但你的代码呢?
  • 你是说我的模特? ,我需要在模型名称旁边显示其他内容吗?
  • 或者我应该显示架构生成器吗?
  • 您为尝试实现目标而编写的代码。我们很乐意帮助您修复代码,但不是为您编写代码。

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

一旦您定义了 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。

【讨论】:

  • 我试过了,但现在给我的是用户表中的所有用户,这些用户在项目表中没有给定的 pid 而不是共享项目表
【解决方案2】:

我使用普通的 mysql 查询,这似乎对我有用:

 $nonSharedUsers = DB::select( DB::raw("SELECT iduser FROM users WHERE  NOT EXISTS (SELECT * FROM sharedProjects WHERE sharedProjects.iduser= users.iduser and sharedProjects.pid=:projectId)"), array(
                     'projectId' => $pid,
                    ));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2014-04-27
    • 2015-12-06
    • 2021-11-16
    • 2014-08-18
    • 2018-12-03
    • 2015-05-16
    • 2021-02-02
    相关资源
    最近更新 更多