Laravel Eloquent 从 belongsToMany() 查询中排除特定结果
Laravel Eloquent exclude specific result from belongsToMany() query
在User.php模型上我有以下关系:
public function roles()
{
return $this->belongsToMany(Role::class);
}
在数据库中,我有不同的角色,基本上我想要 return 所有角色,除了 "superadmin" 角色,这样它就不能显示在视图中或我选择的任何地方显示角色。
我试过类似的方法:
public function roles()
{
return $this->belongsToMany(Role::class)->where('name', '!=', 'superadmin');
}
...但它不起作用。我认为它与枢轴 table 有关。我也试过这个:
public function roles()
{
return $this->belongsToMany(Role::class)->where('role_id, '!=', $id);
}
知道如何做到这一点,或者是否可能?
谢谢!
您应该尝试在角色模型上使用作用域。
您可以创建一个名为 DisplayRole 的范围,它基本上 return 包含不包括超级管理员并且可以向用户显示的所有角色。它看起来像这样:
namespace App;
use Illuminate\Database\Eloquent\Model;
class DisplayRole extends Role
{
public function newQuery($excludeDeleted = true)
{
return parent::newQuery($excludeDeleted)->where('name','!=','superadmin');
}
}
然后您可以像通常使用模型一样使用 DisplayRole(使用 App\DisplayRole),在任何您只需要显示用户友好角色的地方,使用该模型而不是基础好榜样。这样,调用 DisplayRole::all() 将 return 所有不是超级管理员的角色。
对于任何感兴趣的人,这是我解决这个问题的方法。感谢用户 eResourcesInc 提出的想法。但是,我选择让它变得简单一点,所以我直接在 Role.php 模型上添加了范围,而不是创建一个单独的 php 文件并使用它。像这样:
public function scopeExclude($query, $role)
{
return $query->where('name', '!=', $role);
}
然后,每当我需要获得角色时,我现在可以排除任何我想要的角色而只获得其他角色,就像这样:
$roles = Role::exclude('superadmin')->get();
再次感谢您的想法!
在User.php模型上我有以下关系:
public function roles()
{
return $this->belongsToMany(Role::class);
}
在数据库中,我有不同的角色,基本上我想要 return 所有角色,除了 "superadmin" 角色,这样它就不能显示在视图中或我选择的任何地方显示角色。
我试过类似的方法:
public function roles()
{
return $this->belongsToMany(Role::class)->where('name', '!=', 'superadmin');
}
...但它不起作用。我认为它与枢轴 table 有关。我也试过这个:
public function roles()
{
return $this->belongsToMany(Role::class)->where('role_id, '!=', $id);
}
知道如何做到这一点,或者是否可能?
谢谢!
您应该尝试在角色模型上使用作用域。
您可以创建一个名为 DisplayRole 的范围,它基本上 return 包含不包括超级管理员并且可以向用户显示的所有角色。它看起来像这样:
namespace App;
use Illuminate\Database\Eloquent\Model;
class DisplayRole extends Role
{
public function newQuery($excludeDeleted = true)
{
return parent::newQuery($excludeDeleted)->where('name','!=','superadmin');
}
}
然后您可以像通常使用模型一样使用 DisplayRole(使用 App\DisplayRole),在任何您只需要显示用户友好角色的地方,使用该模型而不是基础好榜样。这样,调用 DisplayRole::all() 将 return 所有不是超级管理员的角色。
对于任何感兴趣的人,这是我解决这个问题的方法。感谢用户 eResourcesInc 提出的想法。但是,我选择让它变得简单一点,所以我直接在 Role.php 模型上添加了范围,而不是创建一个单独的 php 文件并使用它。像这样:
public function scopeExclude($query, $role)
{
return $query->where('name', '!=', $role);
}
然后,每当我需要获得角色时,我现在可以排除任何我想要的角色而只获得其他角色,就像这样:
$roles = Role::exclude('superadmin')->get();
再次感谢您的想法!