对 Laravel 中的多对多关系有一些帮助:
使用角色和用户的示例 - 基本上:
- 所有角色的表格
- 用户表
- 以及带有 user_id 和 role_id 的表。
我想添加到第三个表中,例如 Year。基本上,数据透视表将具有 user_id、role_id 和 year_id。
我希望能够进行查询以提取例如在特定年份分配特定角色的所有用户。例如,所有 role_id = 2 且 year_id = 1 的用户。
任何帮助将不胜感激
对 Laravel 中的多对多关系有一些帮助:
使用角色和用户的示例 - 基本上:
我想添加到第三个表中,例如 Year。基本上,数据透视表将具有 user_id、role_id 和 year_id。
我希望能够进行查询以提取例如在特定年份分配特定角色的所有用户。例如,所有 role_id = 2 且 year_id = 1 的用户。
任何帮助将不胜感激
在回答之前,我想建议你不要像这样将年份放在数据库中。你所有的桌子都应该有created_at
,updated_at
而且应该足够了。
过滤您想要的用户。你可以这样做:
// This queries all users that were assigned to 'admin' role within 2013.
User::join('role_users', 'role_users.user_id', '=', 'users.id')
->join('roles', 'roles.id', '=', 'role_users.role_id')
->where('roles.name', '=', 'admin')
->where(DB::raw('YEAR(role_users.created_at)', '=', '2013')
->get();
此示例可能不是您要查找的精确查询,但应该足以让您想出它。
使用 Eloquent 实现三向关系的最佳方法是为表示该关系的表创建一个模型。数据透视表旨在用于双向关系。
然后,您可以拥有一个名为的表,该表roles_users_year
可以包含与这种 3 向关系相关的数据,例如时间戳或其他任何东西......
一个非常老的问题的一个非常晚的答案,但是从文档来看,Laravel 支持至少 Laravel 5.1 的附加中间(数据透视)表列,至少在 Laravel 6.x 中没有改变。
在定义多对多关系时,您可以描述这些额外的列:
return $this->belongsToMany(Role::class)->withPivot('column1', 'column2');
或者在您的情况下,以下内容也可以完成这项工作:
return $this->belongsToMany(Role::class)->withTimestamps();
然后您可以通过pivot
模型上的属性访问它:
$user = User::find(1);
foreach ($user->roles as $role) {
echo $role->pivot->created_at;
}
请注意,pivot 属性位于远程关系模型(单个Role
)上,而不是关系本身。
要获取任何给定年份中Role
分配给User
s 的所有 s,您可以创建一个特殊的关系:
// User.php
public function rolesInYear($year) {
return $this->belongsToMany(Role::class)
->wherePivot('created_at', '>=', Carbon::create($year))
->wherePivot('created_at', '<', Carbon::create($year + 1));
}