Laravel 5.7 的时候,用到 permission ,求批量给角色添加用户. 我用了最土的方法,循环用户添加角色.

用到permission ,给角色添加用户. 我用了最土的方法,循环用户添加到角色.虽然实现了功能,但是觉得应该有更高效的方法. 不知道有遇到过同样问题的么?
或者哪位大哥指教一下.
接触laravel不久.望海涵.

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

RoleUser是多对多的关系,可以用attach方法添加关联,attach方法支持数组,所以可以Role::find(1)->attach([1,2,3,4,5]),传一个用户ID的数组就行,或者如果需要同步,可以使用sync方法,使用方式同attach方法

5年前 评论
讨论数量: 2

RoleUser是多对多的关系,可以用attach方法添加关联,attach方法支持数组,所以可以Role::find(1)->attach([1,2,3,4,5]),传一个用户ID的数组就行,或者如果需要同步,可以使用sync方法,使用方式同attach方法

5年前 评论

@FMW 首先感谢一下,给了思路.走多态关联.然后看了一下文档,完美解决了该问题.通常看文档的时候只知其表不解其意.

说一下大概的思路流程,希望可以帮助其他人能够更优雅的写出适合的代码.
了解一下模型的多对多, 文档链接: 模型关联《Laravel 5.7 中文文档》

了解之后,看文档 插入 & 更新关联模型 这块的多对多关联,链接 模型关联《Laravel 5.7 中文文档》

了解其中的 附加 / 分离 代码思路同文档例子类似,文档上是用户对多角色,而我在项目中,实际是角色对应多用户.
由于permission 的role模型中已经关联了 用户.
源代码:

   /**
     * A role belongs to some users of the model associated with its guard.
     */
    public function users(): MorphToMany
    {
        return $this->morphedByMany(
            getModelForGuard($this->attributes['guard_name']),
            'model',
            config('permission.table_names.model_has_roles'),
            'role_id',
            config('permission.column_names.model_morph_key')
        );
    }

我可以通过role 获取对应的用户关联.
付我完成后的代码 其中备注了一些 希望能帮助其他人:

/**
 * 给角色添加管理员
 * @param Request $request
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function addUser(Request $request)
{
    if ($request->isMethod('post')) {
        $id = $request['role_id']; #角色id
        $id_arr = $request['admin_id'];#admin_id 数组.
        if (!$id_arr) {
            return $this->backMessage('请选择要授权的用户!');
        }
        $role = Role::findById($id);
        if (!$role) {
            return $this->backMessage('授权的角色不存在!');
        }
        //移除(detach)角色对应的用户,然后再新增(attach)
        #$role->users()->detach();
        #$result = $role->users()->attach($id_arr);
        //切换关联
        #$result = $role->users()->toggle($id_arr);
        //同步关联 ,切换关联与同步关联效果一致.
        $result = $role->users()->sync($id_arr);
        if ($result) {
            return $this->backMessage('授权用户到角色成功.', 1);
        } else {
            return $this->backMessage('授权用户到角色失败.');
        }
    }
    return $this->backMessage('非法请求!');
}

最后再次感谢 @FMW 指明方向. :+1:

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!