laravel eloquent从belongtomany()查询中排除特定结果

yc0p9oo0  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(381)

在user.php模型上,我有以下关系:

public function roles()
{
    return $this->belongsToMany(Role::class);
}

在数据库中,我有不同的角色,基本上我想返回所有的角色,除了“超级管理员”角色,这样它就不能显示在视图中或我选择显示角色的任何地方。
我试过这样的方法:

public function roles()
{
    return $this->belongsToMany(Role::class)->where('name', '!=', 'superadmin');
}

... 但它不起作用。我想这和透视表有关。我也试过这个:

public function roles()
{
    return $this->belongsToMany(Role::class)->where('role_id, '!=', $id);
}

你知道怎么做吗?如果可能的话?
谢谢!

wn9m85ua

wn9m85ua1#

对任何感兴趣的人来说,我是这样解决这个问题的。感谢用户eresourcesinc的创意。但是,我选择让它简单一点,所以我直接在role.php模型上添加了作用域,而不是创建一个单独的php文件并使用它。像这样:

public function scopeExclude($query, $role)
{
    return $query->where('name', '!=', $role);
}

然后,每当我需要获得角色时,我现在可以排除任何我想要的角色,只获得其他角色,如下所示:

$roles = Role::exclude('superadmin')->get();

再次感谢你的想法!

nzkunb0c

nzkunb0c2#

您应该尝试在角色模型上使用作用域。
您可以创建一个名为displayrole的作用域,该作用域基本上返回所有不包括superadmin的角色,并且可以显示给用户。它看起来像这样:

namespace App;

use Illuminate\Database\Eloquent\Model;

class DisplayRole extends Role
{
    public function newQuery($excludeDeleted = true)
    {
        return parent::newQuery($excludeDeleted)->where('name','!=','superadmin');
    }
}

然后,您可以像通常使用模型(使用app\displayrole)一样使用displayrole,在任何只需要显示用户友好角色的地方,使用该模型而不是基本角色模型。这样,调用displayrole::all()将返回所有不是超级管理员的角色。

相关问题