Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩地从belongToMany()查询中排除特定结果_Php_Mysql_Laravel_Eloquent_Has And Belongs To Many - Fatal编程技术网

Php Laravel雄辩地从belongToMany()查询中排除特定结果

Php Laravel雄辩地从belongToMany()查询中排除特定结果,php,mysql,laravel,eloquent,has-and-belongs-to-many,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::cla

在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);
}
你知道怎么做吗,或者如果可能的话


谢谢

您应该尝试在角色模型上使用作用域

您可以创建一个称为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');
    }
}
$roles = Role::exclude('superadmin')->get();

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

您应该尝试在角色模型上使用作用域

您可以创建一个称为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');
    }
}
$roles = Role::exclude('superadmin')->get();

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

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

public function scopeExclude($query, $role)
{
    return $query->where('name', '!=', $role);
}
然后,每当我需要获得角色时,我现在可以排除我想要的任何角色,只获得其他角色,如下所示:

namespace App;

use Illuminate\Database\Eloquent\Model;

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

再次感谢你的想法

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

public function scopeExclude($query, $role)
{
    return $query->where('name', '!=', $role);
}
然后,每当我需要获得角色时,我现在可以排除我想要的任何角色,只获得其他角色,如下所示:

namespace App;

use Illuminate\Database\Eloquent\Model;

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

再次感谢你的想法

谢谢你的主意!我脑子里有个大洞,我完全忘记了望远镜。我直接在角色模型上提出了一个名为scopeExclude()的范围。如下所示:
public function scopeExclude($query,$role){return$query->where('name','!=',$role);}
然后我会在任何地方这样调用它:
role::exclude('superadmin')->get()谢谢你的想法!我脑子里有个大洞,我完全忘记了望远镜。我直接在角色模型上提出了一个名为scopeExclude()的范围。如下所示:
public function scopeExclude($query,$role){return$query->where('name','!=',$role);}
然后我会在任何地方这样调用它:
role::exclude('superadmin')->get()