我在belongsToMany()
和User
之间有Group
关系。该用户所属的任何组中都有一个level
。
public function groups()
{
return $this->belongsToMany('App\Group', 'user_group', 'user_id', 'group_id')
->withPivot('level');
}
这很好用。
但是,如果User
是管理员,我希望groups函数返回带有Group
的所有level = 3
,无论该关系是否存在于数据透视表中。
我可以成功创建一个Collection
,它镜像数据结构如下:
\App\Group::all()->transform(function ($item, $key) use ($uid) {
$item->pivot = collect(['user_id'=>$uid,'group_id'=>$item->id,'level'=>3]);
return $item;
});
但是,我不能替换两个输出,因为一个输出返回一个belongsTo
关系实例,另一个返回一个Collection
。这意味着我可以在前者上叫->get()
,但不能叫后者。
我考虑过使用DB::
门面并为后者创建一个Builder
,但是我不能手动添加数据透视值。
关于如何实现这一目标的任何想法?
-更新-
我目前正在通过在->get()
方法内添加groups()
作弊,但这很麻烦,我仍然想知道是否有更好的方法来解决此问题。
public function groups()
{
if ($this->isAdmin()) {
return \App\Group::all()->transform(function ($item, $key) use ($uid) {
$item->pivot = collect(['user_id'=>$uid,'group_id'=>$item->id,'level'=>3]);
return $item;
});
} else {
return $this->belongsToMany('App\Group', 'user_group', 'user_id', 'group_id')
->withPivot('level')->get();
}
}
答案 0 :(得分:1)
因此,该解决方案应该可以工作(未经测试),但是它不是“最干净的”,最好通过其他机制来访问所有组,但是因为我不知道您的管理实现,所以很难猜测。 / p>
public function groups()
{
return $this->belongsToMany('App\Group', 'user_group', 'user_id', 'group_id')
->withPivot('level');
}
public function scopeSpecialGroups($query)
{
return $query->when($this->role === 'admin',function($query){
return Group::where('level', '>', 3');
})->when($this->role != 'admin',function($query){
return $query->with('groups');
});
}
那么您应该可以致电User::specialGroups()->get();