Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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 使用查询范围加载约束_Php_Laravel_Eloquent_Relationships - Fatal编程技术网

Php 使用查询范围加载约束

Php 使用查询范围加载约束,php,laravel,eloquent,relationships,Php,Laravel,Eloquent,Relationships,我正在创建一个管理面板,我的数据库中有3个表:组、角色、用户。在users表和roles表之间存在多对多关系。 没有解释此功能的laravel文档 public function roles() { return $this->belongsToMany('App\Models\Role', 'user_roles'); } 我在groups表和users表之间有一对多的关系 public function group() { return $this->belon

我正在创建一个管理面板,我的数据库中有3个表:组、角色、用户。在users表和roles表之间存在多对多关系。 没有解释此功能的laravel文档

public function roles() {
    return $this->belongsToMany('App\Models\Role', 'user_roles');
}
我在groups表和users表之间有一对多的关系

public function group() {
    return $this->belongsTo('App\Models\Group');
}
现在我想通过快速加载将过滤器应用于查询。有了这些,我想添加以下动态过滤器

public function scopeStatus($query, $status = null) {
    // If status is empty then return the query itself
    if (is_null($status)) {
        return $query;
    }

    return $query->where('status', $status);
}

public function scopeRole($query, $role = null) {
// If role is empty then return the query itself
if (is_null($role)) {
    return $query;
}

return $query->where('role', $role);
}

public function scopeGroup($query, $group = null) {
    // If group is empty then return the query itself
    if (is_null($group)) {
       return $query;
    }

    return $query->where('group_id', $group);
}
这样我就可以进行一些查询,比如[状态和组id只是用户表中的列]

$users = User::with([
    'roles' => function ($query) use ($request) {
        $query->role($request['role']);
    }, 

    'group' => function($query) use ($request) {
        $query->group($request['group']);
    }
])
    ->status($request['status'])
    ->paginate(20);
但这是行不通的。我通过一个AJAX请求来实现这一点,并测试了请求参数。这就是我在执行
dd($request)时得到的结果


一切看起来都很好,但我总是收到空的东西。非常感谢您的帮助。

我找到了问题的解决方案。我已经意识到,使用渴望加载时,在约束它们时不能添加范围。必须在闭包或查询生成器中执行所有条件语句

因此,对于我的问题,除了状态之外,不需要所有的作用域。这是新代码:

$users=User::with([
“角色”=>函数($query)使用($request){
if(为null($request['role'])){
$query;
}否则{
$query->where('id',$request['role']);
}
},
“组”=>函数($query)使用($request){
if(为null($request['group'])){
$query;
}否则{
$query->where('id',$request['group']);
}
}
])->状态($request['status']))

->分页(20)
在运行
$users=User::…
之前,您能否显示示例
dd($request)
?好的,我将把它作为编辑添加到问题中,从
$users=User::status($request['status')->分页(20)开始-是否获得预期结果?是否筛选组=1、角色=1、状态=1的用户?还是要加载状态为1的所有用户,但只加载组1和角色1?我要执行筛选器组=1角色=1和状态=1
array:3 [▼
  "group" => "1"
  "role" => "1"
  "status" => "1"
]