我正在尝试学习 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/