1

对 Laravel 中的多对多关系有一些帮助:

使用角色和用户的示例 - 基本上:

  • 所有角色的表格
  • 用户表
  • 以及带有 user_id 和 role_id 的表。

我想添加到第三个表中,例如 Year。基本上,数据透视表将具有 user_id、role_id 和 year_id。

我希望能够进行查询以提取例如在特定年份分配特定角色的所有用户。例如,所有 role_id = 2 且 year_id = 1 的用户。

任何帮助将不胜感激

4

3 回答 3

1

在回答之前,我想建议你不要像这样将年份放在数据库中。你所有的桌子都应该有created_atupdated_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-03-25T12:28:44.377 回答
0

使用 Eloquent 实现三向关系的最佳方法是为表示该关系的表创建一个模型。数据透视表旨在用于双向关系。

然后,您可以拥有一个名为的表,该表roles_users_year可以包含与这种 3 向关系相关的数据,例如时间戳或其他任何东西......

于 2013-07-25T06:23:53.220 回答
0

一个非常老的问题的一个非常晚的答案,但是从文档来看,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分配给Users 的所有 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));
}
于 2020-02-13T02:51:41.427 回答