我正在构建一个拥有用户的系统。用户具有角色和角色具有操作。我的模型设置如下:
用户
/**
* The roles that belong to the user.
*
* @return Object
*/
public function roles()
{
return $this->belongsToMany('App\Models\User\Role')->withTimestamps();
}
角色
/**
* The actions that belong to the role.
*
* @return Object
*/
public function actions()
{
return $this->belongsToMany('App\Models\User\Action')->withPivot('path');
}
/**
* The users that belong to the role.
*
* @return Object
*/
public function users()
{
return $this->belongsToMany('App\Models\User\User');
}
动作
/**
* The roles that belong to the action.
*
* @return Object
*/
public function roles()
{
return $this->belongsToMany('App\Models\User\Role');
}
我正在尝试使用以下内容搜索用户操作:
$user->whereHas('roles.actions', function($query) use ($id, $path, $method){
$query->where('user.id', $id);
$query->where('action.path', $path);
$query->where('action.method', $method);
})->get();
但是,由于某种原因,返回的对象为空(没有返回任何行)。如果我删除$query->where('action.path', $path);
它有效,但这是没有意义的,因为我需要那部分。
生成的SQL是:
select * from `user`
where `user`.`cust_id` = 1
and (
select count(*) from `role`
inner join `role_user` on `role`.`id` = `role_user`.`role_id`
where `role`.`cust_id` = 1
and `role_user`.`user_id` = `user`.`id`
and
(
select count(*) from `action`
inner join `action_role` on `action`.`id` = `action_role`.`action_id`
where `action`.`cust_id` = 1
and `action_role`.`role_id` = `role`.`id`
and `user`.`id` = 1
and `action`.`path` = '/admin/users/administrators/{id}/changePassword'
and `action`.`method` = 'GET'
and `action`.`cust_id` = 1
) >= 1
and `role`.`cust_id` = 1
) >= 1
我的用户表包含以下数据:
id cust_id name
1 1 John Smith
我的行动表包含以下数据:
id cust_id path method
1 1 /admin/users/administrators/{id}/changePassword GET
为什么这不起作用?
答案 0 :(得分:1)
我真的不明白这是一个有效的查询,因为你正在查询子查询中users
表中的一列没有加入与用户有关的任何内容。
试试这个。
$user->whereHas('roles.actions', function($query) use ( $path, $method){
$query->where('path', $path);
$query->where('method', $method);
})->find($id);
答案 1 :(得分:0)
删除->withPivot('path');
然后重试
答案 2 :(得分:0)
如您的问题中所述,另一个 HERE path
不是您的数据透视表{{1}的额外属性} - 保持模型action_role
和Role
之间的关系。
相反,它是Action
表的属性。因此,使用action
您在withPivot('path')
(即pivot
)上定义了不存在的额外属性,因此根本不需要。
如果您添加第action_role
行,则会获得空集,最可能的原因是$query->where('action.path', $path)
中提供了不正确的或null
值变量。仔细检查它是否具有正确的值。
注意: 据我所知,您无法像$path
那样执行whereHas
(虽然我不太确定它是什么保持)。
即使$user
是用户集合(通过$user
获取),使用App\Models\User::all()
的适当方法是在{{{}}等模型上使用它1}}或者一个关系。