gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:44:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com