Laravel嵌套关系在哪里

时间:2015-09-16 13:27:40

标签: php laravel laravel-4 laravel-5

我正在构建一个拥有用户的系统。用户具有角色和角色具有操作。我的模型设置如下:

用户

/**
 * 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

为什么这不起作用?

3 个答案:

答案 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_roleRole之间的关系。

相反,它是Action表的属性。因此,使用action您在withPivot('path')(即pivot)上定义了不存在的额外属性,因此根本不需要。

如果您添加第action_role行,则会获得空集,最可能的原因是$query->where('action.path', $path)中提供了不正确的null值变量。仔细检查它是否具有正确的值。

注意: 据我所知,您无法像$path那样执行whereHas(虽然我不太确定它是什么保持)。 即使$user是用户集合(通过$user 获取),使用App\Models\User::all()的适当方法是在{{{}}等模型上使用它1}}或者一个关系。