【发布时间】:2017-01-05 21:13:40
【问题描述】:
假设情况:假设我们有 3 个模型:
UserRolePermission
假设User 与Role 具有多对多关系,Role 与Permission 具有多对多关系。
所以他们的模型可能看起来像这样。 (我故意让他们简短。)
class User
{
public function roles() {
return $this->belongsToMany(Role::class);
}
}
class Role
{
public function users() {
return $this->belongsToMany(User::class);
}
public function permissions() {
return $this->belongsToMany(Permission::class);
}
}
class Permission
{
public function roles() {
return $this->belongsToMany(Role::class);
}
}
如果您想为User 获取所有Permissions 怎么办?没有BelongsToManyThrough。
您似乎在做一些感觉不太正确的事情,并且不适用于 User::with('permissions') 或 User::has('permissions') 之类的事情。
class User
{
public function permissions() {
$permissions = [];
foreach ($this->roles as $role) {
foreach ($role->permissions as $permission) {
$permissions = array_merge($permissions, $permission);
}
}
return $permissions;
}
}
这个例子只是一个例子,不要过多解读。关键是,您如何定义 custom 关系?另一个例子可能是 Facebook 评论与作者母亲之间的关系。很奇怪,我知道,但希望你能明白。自定义关系。怎么样?
在我看来,一个好的解决方案是以类似于 Laravel 中描述任何其他关系的方式来描述这种关系。返回 Eloquent Relation 的东西。
class User
{
public function permissions() {
return $this->customRelation(Permission::class, ...);
}
}
这样的东西已经存在了吗?
【问题讨论】:
-
是的,返回一个关系,而不是一个物化数组。您可以从现有关系开始并添加到它。 See this example.
-
@bishop 有趣!我没有想过要操纵现有的关系。 Laravel 在文档中需要一个“食谱”页面来处理此类内容。 :)