获取关系中的所有记录?

时间:2014-08-27 15:59:00

标签: php laravel laravel-4 eloquent

我有以下Laravel模型:

class User extends ConfideUser implements UserInterface, RemindableInterface
{
    use HasRole;

    public function stores()
    {
        if ($this->hasRole('root')) {
            return $this->belongsToMany('Store')->orWhereNull('store_user.user_id');
        } else {
            return $this->belongsToMany('Store');
        }
    }
}

每个user都属于许多store,此关系是通过标准数据透视表'store_user'创建的。

如果我执行以下操作,我会获得用户的所有商店:

$stores = Auth::user()->stores;

但是,如果该用户具有root角色,我想要检索所有商店。这很简单,可以使用简单的选择返回所有商店,但是为了使stores()方法一致地运行,Laravel希望它返回Illuminate\Database\Eloquent\Relations\Relation类型的对象。

如何返回选中所有商店的Relation对象,而不仅仅返回root用户在store_user数据透视表中的商店?

2 个答案:

答案 0 :(得分:0)

不擅长模特但是......这可能有用

    public function stores()
{
    if ($this->hasRole('root')) {
        $all_stores = DB::table('where_ever_stores_are')->get();
        return $all_stores;
    } else {
        return $this->belongsToMany('Store');
    }
}

这只会返回所有商店,对于可能更难的关系,你想要在返回的数组中输出什么?

答案 1 :(得分:0)

我认为你进行检查的设计是完全错误的!

只需

public function stores()
{
    return $this->belongsToMany('Store');
}

让你的控制器进行检查:

public function inMyController()
{
    if ( $user->hasRole('root') ) {
        return Store::all();
    } else {
        return $user->stores;
    }
}

您的模型应该只关心模型本身,而不是照顾权限。

更好的方法是拥有一个处理所有模型查询的Repository。然后,您的控制器只需与存储库进行对话即可。