【发布时间】:2021-08-16 12:12:43
【问题描述】:
我有角色和管理员表以及 admin_role 的数据透视表
角色表结构
id, role_name, slug
admins 表结构
id, name, email, phone
admin_role 表结构
id, role_id, admin_id
Admin.php 模型
public function roles() {
return $this->belongsToMany(Role::class,'admin_role');
}
Role.php 模型
public function admins() {
return $this->belongsToMany(Admin::class,'admin_role');
}
AdminController.php
public function getTeams() {
try {
$selectedName = request('name');
$selectedRole = request('role');
$selectedPhone = request('phone');
$admins = Admin::with(['roles','resources'])
->when($selectedName, function($query) use($selectedName) {
$query->where('name', 'like', '%' .$selectedName.'%');
})
->when($selectedPhone, function($query) use($selectedPhone) {
$query->where('phone_number', $selectedPhone);
})
->when($selectedRole, function($query) use($selectedRole) {
$query->whereHas('roles', function ($q) use($selectedRole){
$q->whereIn('role_id', $selectedRole);
});
})
->orderBy('id', 'desc')
->paginate(10);
return response()->json($admins);
} catch (\Illuminate\Database\QueryException $e) {
$e = "Get teams Api Error";
return response()->json($e);
}
}
上面的查询工作正常,它根据选定的姓名、电话过滤数据,但在添加 whereHas 子句进行基于角色的过滤后,它返回空数组。仅当我在选定角色中传递数据时,过滤才有效。
关于我在哪里犯错的任何建议。
我已经添加了管理表的 UI。
如果不应用任何过滤器,如(姓名、电子邮件、电话、角色),它应该根据我添加的默认查询显示数据。选择过滤器选项后,它应该根据该过滤器参数显示数据。
我的问题:如果我传递了角色,那么数据会显示在表中,但如果没有选择任何过滤器,那么就会出现空表而不是默认数据。
在我从AdminController 删除以下查询后,数据将返回到UI table,但如果我添加它,则只有在选择角色时才会返回数据。
->when($selectedRole, function($query) use($selectedRole) {
$query->whereHas('roles', function ($q) use($selectedRole){
$q->whereIn('role_id', $selectedRole);
});
})
【问题讨论】:
-
你在 $selectedRole 中得到了什么?是单值还是数组?
-
它是一个类似 ["1","2"] 的数组
-
尝试改变:$q->whereIn('role_id', $selectedRole); to $q->whereIn('id', $selectedRole);