我有以下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
数据透视表中的商店?
答案 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。然后,您的控制器只需与存储库进行对话即可。