Laravel:创建一个带有Pivot关系的假belongsToMany

时间:2018-12-11 20:18:01

标签: php laravel laravel-5 laravel-5.7

我在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();

    }
}

1 个答案:

答案 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();

相关问题