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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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