【问题标题】:Getting all records from a relation?从关系中获取所有记录?
【发布时间】:2014-10-21 07:33:27
【问题描述】:

我有以下 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 都属于许多stores,并且这种关系是通过标准数据透视表'store_user' 创建的。

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

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

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

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

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为这不会返回关系。
    【解决方案2】:

    我认为你的支票设计是完全错误的!

    只是有

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

    并让您的控制器进行检查:

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

    您的模型应该只关心模型本身而不是处理权限。

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

    【讨论】:

    • User 模型直接通过Confide 和Entrust 类包进行权限和角色管理。我只是试图从User 模型扩展功能,因为这种关系也可以通过Auth 和通过预加载访问,这在其余代码中非常方便。如果我将它移到控制器上,我就会失去它,并且必须走 IoC 路线才能通过其他模型和控制器访问这些功能。
    猜你喜欢
    • 2019-06-12
    • 2017-04-22
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2016-03-25
    相关资源
    最近更新 更多