Laravel Eloquent从belongsToMany()查询中排除特定结果

时间:2018-11-08 21:18:06

标签: php mysql laravel eloquent has-and-belongs-to-many

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

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

在数据库中,我具有不同的角色,并且基本上我想返回所有角色,除了“ superadmin”角色之外,这样它就无法在视图中显示或我选择显示角色的任何位置。

我尝试过类似的事情:

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

...但是它不起作用。我认为这与数据透视表有关。我也尝试过:

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

有什么想法或者甚至有可能吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您应该尝试在“角色”模型上使用“范围”。

您可以创建一个名为DisplayRole的作用域,该作用域基本上会返回所有不包含超级管理员并且可以显示给用户的角色。看起来像这样:

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来使用,而只需要显示用户友好角色的任何地方,都可以使用该模型而不是基本Role模型。这样,调用DisplayRole :: all()将返回不是超级管理员的所有角色。

答案 1 :(得分:1)

对于任何有兴趣的人,这就是我解决的方法。感谢用户eResourcesInc的想法。但是,我选择使它简单一些,因此我直接在Role.php模型上添加了作用域,而不是创建一个单独的php文件并使用它。像这样:

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

然后,每当我需要获得角色时,现在就可以排除我想要的任何角色,而仅获得其他角色,就像这样:

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

再次感谢您的创意!