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();

再次感谢您的想法!