在Laravel,有些人帮助了很多人建立了很多关系:
使用角色和用户的示例--基本上:
我想加到第三张表上(如年份)。基本上,支点表将包含user_id、role_id和year_id。
我希望能够进行一个查询,例如,在特定的一年中,所有用户都指定了一个特定的角色。role_id = 2和year_id = 1的所有用户。
如有任何帮助,将不胜感激。
发布于 2013-03-25 12:28:44
在回答之前,我建议你不要把这样的一年放在数据库上。所有的表都应该有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();这个例子可能不是您想要的确切的查询,但应该足够您想出它。
发布于 2013-07-25 06:23:53
以雄辩的方式实现三向关系的最好方法是为表创建一个表示这种关系的模型。枢轴表用于双向关系。
然后,您可以有一个名为roles_users_year的表,它可以包含与这个3路关系相关的数据,比如时间戳或其他任何东西。
发布于 2020-02-13 02:51:41
对于一个非常老的问题,一个非常晚的答案,但Laravel支持附加的中间(枢轴)表列,至少从文档的角度来看,Laravel5.1表列没有变化,至少通过Laravel6.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;
}请注意,透视属性位于远程关系模型(单个Role)上,而不是关系本身上。
为了在任何给定的年份中将所有的Role分配给User,您可以创建一个特殊的关系:
// User.php
public function rolesInYear($year) {
return $this->belongsToMany(Role::class)
->wherePivot('created_at', '>=', Carbon::create($year))
->wherePivot('created_at', '<', Carbon::create($year + 1));
}https://stackoverflow.com/questions/15590397
复制相似问题