【发布时间】:2020-11-08 14:23:45
【问题描述】:
我试图根据角色隔离不同的团队成员,在刀片视图的 $teams 中将它们过滤为 $team @foreach 循环。输出将是具有给定角色的团队成员的简单列表。几天来,我一直在网上寻找线索,我确信答案就在我面前——我只是还没有看到。理想情况下,我希望能够使 api 流在逻辑上,例如类似于以下内容:
$team->user->role('manager')
Team、User 和 Role 类之间的关系都是多对多的
团队.php
public function users()
{
return $this->belongsToMany(User::class, 'team_user', 'team_id', 'user_id')->withTimestamps();
}
用户.php
public function teams()
{
return $this->belongsToMany(Team::class, 'team_user', 'user_id', 'team_id')->withTimestamps();
}
public function roles()
{
return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id')->withTimestamps();
}
角色.php
public function users()
{
return $this->belongsToMany(User::class, 'role_user', 'role_id', 'user_id')->withTimestamps();
}
管理员/TeamsController.php
public function index()
{
$teams = Team::with('users')->orderBy('location', 'asc')->paginate(10);
return view('admin.teams.index')->with([
'teams' => $teams,
]);
}
那么,为了在刀片视图中隔离给定团队的每个成员的角色,我们必须做些什么来加载这样的多个关系?
编辑以显示最终解决方案(来自下面@wschopohl 的强大输入):
在 Team.php 类中:
public function userWithRole($role)
{
return $this->users()->whereHas('roles', function ($query) use ($role) {
$query->where('name', $role);
})->with('roles')->get();
}
index.blade.php
@foreach ($teams as $team)
<tr>
<td class="px-4 py-2 border">{{ $team->location }}</td>
<td class="px-4 py-2 border">
@foreach ($team->userWithRole('lead') as $user)
<li style="list-style: none;">{{ $user->name }}</li>
@endforeach
</td>
<td class="px-4 py-2 border">
@foreach ($team->userWithRole('manager') as $user)
<li style="list-style: none;">{{ $user->name }}</li>
@endforeach
</td>
<td class="px-4 py-2 border">
@foreach ($team->userWithRole('somethingelse') as $user)
<li style="list-style: none;">{{ $user->name }}</li>
@endforeach
</td>
</tr>
@endforeach
【问题讨论】:
标签: mysql laravel eloquent laravel-blade php-7