2014-08-27 130 views
2

我有以下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 S和通过标准的数据透视表'store_user'建立这种关系。

如果我这样做,我得到的所有店铺,为用户:

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

但是,如果用户有root角色,我要检索的所有门店。这很简单,可以使用简单的选择来返回所有商店,但对于stores()方法来说,功能始终如一,Laravel希望它返回Illuminate\Database\Eloquent\Relations\Relation类型的对象。

如何返回一个Relation对象,而不是只有root用户在store_user数据透视表中拥有的所有商店?

回答

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'); 
    } 
} 

这只会返回所有的商店,作为关系可能会更难,什么是放了你想在返回的数组?? ??

+0

我不认为这会返回一个关系。 – 2014-08-27 16:11:22

0

我认为你的设计有这种检查是错误的!

只需

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

和你的控制器做检查:

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

你的模型应该只理会模型本身,而不是取权限的照顾。

更好的方法是创建一个处理所有模型查询的Repository。然后,您的控制器只需与存储库进行交谈。

+0

'用户'模型直接通过'Confide'和'Entrust'类包拥有权限和角色管理。我只是想从'User'模型扩展功能,因为这个关系也可以通过'Auth'和通过预加载来访问,这在代码的其余部分非常方便。如果我将它移动到控制器上,我就会失去它并且必须通过IoC路线通过其他模型和控制器访问这些功能。 – eComEvo 2014-08-27 18:43:54