【问题标题】:The proper way to setup relationship models in Eloquent repository setup在 Eloquent 存储库设置中设置关系模型的正确方法
【发布时间】:2015-11-25 20:39:14
【问题描述】:

我正试图弄清楚如何在我的应用中从管理员创建用户时使用模型关系创建用户角色。

我有以下表格:

用户

users 表包含用户列表。

users_roles

users_roles 表是一个将roles 链接到users 的数据透视表。

角色

roles 表包含角色列表。

我正在尝试使用存储库设置,以便我的控制器没有提及 eloquent。

这是我的控制器:

class ContractorController extends Controller
{
    private $user;

    /**
     * Create a new instance.
     *
     * @return Middleware
     */
    public function __construct(UserRepoInterface $user, TimesheetRepoInterface $timesheet)
    {
        $this->middleware('actions');

        $this->user = $user;
        $this->timesheet = $timesheet;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(CreateUserRequest $request)
    {
        // create user
        $user = $this->user->createUser($request->except('_token'));

        // user was created above so we can use $user object
        $this->user->createUserRole($user);

        return Redirect::back()->withMessage('New user created.');
    }
}

我的仓库:

/**
 * Create new user role.
 *
 * @param $request
 * @return mixed
 */
public function createUserRole($user)
{
    return $this->user->roles()->attach($user);
}

我的用户模型:

/**
 * Get the roles associated with the user.
 *
 * @return Object
 */
public function roles()
{
    return $this->belongsToMany('App\Models\User\UsersRoles', 'users_roles', 'role_id', 'user_id');
}

上面的代码导致在users_roles 表中创建了一条记录,这是正确的,但是我不知道如何在表中关联正确的role_id。

这是插入users_roles的数据:

id    user_id    role_id
1     1          0

如您所见,没有 role_id,因为我不确定如何将其传入。我知道如果我在roles 表中物理创建一个新角色,那么我可以使用这个对象。但是该角色已经存在,所以我只需要将这个新用户与我指定的角色相关联。

请有人指点我如何做到这一点,或者我必须如何调整我的代码?

提前致谢。

【问题讨论】:

  • 您的数据透视表users_roles 应该是单数和字母顺序。例如role_user.
  • 是的,但我已经在我的 belongsToMany 方法中提供了表的名称。另外,我正在使用attach() 方法,请参见上面的代码。

标签: php laravel laravel-5


【解决方案1】:

你应该传递角色数组而不是用户数组

$this->user->createUserRole($user);

而不是这个,它应该是你想要附加给用户的角色

$this->user->createUserRole($roles);//$roles array

【讨论】:

  • 好的,但是如果我这样做,那么 users_roles 表中的 user_id 是空白的
  • 我怎样才能附加user_id?
  • 您的用户模型中有 roles 关系,因此当您应用 createUserRole 时,它将在后面从模型中获取 user_id。
  • 这就是我的想法,但我得到了SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'role_id' cannot be null (SQL: insert into users_roles` (role_id, user_id) 值 (, 2))`
【解决方案2】:

对于任何想要做同样事情的人,我终于设法通过将 user_id 和 role_id 发送到我的存储库来让它工作,如下所示:

$this->user->createUserRole($this->role->findRoleByName('Contractor')->id, $user->id);

然后在我的存储库中我做了以下操作:

/**
 * Create new user role.
 *
 * @param $role
 * @param $user
 * @return mixed
 */
public function createUserRole($role, $user)
{
    return $this->user->roles()->attach($role, ['user_id' => $user]);
}

这会将role_iduser_id 添加到users_roles 表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2015-03-08
    • 2017-12-27
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多