【发布时间】:2021-04-30 13:59:26
【问题描述】:
这是我想要生成的(请注意,一个成员具有固定的角色,并且可以在同一个项目中出现在多个角色下):
Project 1
Gardeners
John Doe
Lisa Smith
Janitors
Eric Black
John Doe
Pool keepers
Bella Johnson
Project 2
Gardeners
Lisa Smith
Janitors
Bella Johnson
John Doe
Lisa Smith
数据库:
项目
idtitle
成员
idname
角色
idname
member_role
idmember_idrole_id
member_role_project
idmember_role_idproject_id
还有比下面更好的方法吗?
class Project extends Model
{
use HasFactory;
public function memberRoles(): BelongsToMany
{
return $this->belongsToMany(MemberRole::class, 'member_role_project', 'project_id', 'member_role_id');
}
public function members(): BelongsToMany
{
return $this->memberRoles()->with('Member', 'Role');
}
}
$projects = Project::with('members')->get();
$data = collect([]);
foreach ($projects as $project) {
$roles = collect([]);
foreach ($project->members as $role) {
if (!$roles->contains('id', $role->Role->id)) {
$roles->push($role->Role);
}
}
$item = [
'project' => $project,
'roles' => $roles->map(function ($role) use ($project) {
return [
'title' => $role->name,
'members' => collect($project->members->where('role_id', $role->id))->sortBy('member.name')
];
})
];
$data->push($item);
}
似乎必须有比这更简单的方法?引用另一个数据透视表的数据透视表让我很头疼,但希望 Laravel 有一个魔术! :)
【问题讨论】: