Laravel 5.2 使用关联来更新属于关系


Laravel 5.2 Using Associate to Update a BelongsTo Relationship

我正在使用路由模型绑定来获取用户实例,然后在验证通过时对其进行更新,然后更新用户和配置文件之间的关联属于关系,但我不断收到错误。 更新发生在用户上,但在更新配置文件时失败。 从我从文档中了解到的情况来看,这似乎是正确的。 我可以使用$user->profile访问配置文件数据,因此在用户和用户配置文件模型中的关系似乎没问题。

任何人都可以看到此控制器操作的问题:

public function update(Request $request, User $user)
{
    $this->validate($request, [
        'username'     => 'required|max:32|unique:users',
        'email'        => 'required|email|max:128|unique:users',
        'first_name'   => 'required',
        'last_name'    => 'required',
        'phone_number' => 'regex:/^([0-9's'-'+'(')'.]*)$/',
    ]);
    $user->update($request->all());
    $profile = new UserProfile($request->all());
    // Also tried:
    //$profile = UserProfile::where(['user_id' => $user->id])->first();
    $user->profile()->associate($profile);
    $user->save();
    return response()->json([
        'message' => trans('user.updated'),
    ]);
}

错误

BadMethodCallException in Builder.php line 2161:
Call to undefined method Illuminate'Database'Query'Builder::associate()

用户模型关系

/**
 * A user has-one profile.
 *
 * @return 'Illuminate'Database'Eloquent'Relations'HasOne
 */
public function profile()
{
    return $this->hasOne('App'UserProfile');
}

用户配置文件模型关系

/**
 * A user profile belongs to a user.
 *
 * @return 'Illuminate'Database'Eloquent'Relations'HasOne
 */
public function user()
{
    return $this->belongsTo('App'User');
}

溶液

$user->fill($request->all())->save();
$profile = UserProfile::where('user_id', $user->id)->first();
$profile->fill($request->all());
$user->profile()->save($profile);
必须先

检索或创建新的profile实体,然后将其放入$profile 中。此外,您在此处具有一对一关系,因此您应该像这样保存用户的配置文件:

$user->profile()->save($profile);

将代码更改为:

public function update(Request $request, User $user)
{
    $this->validate($request, [
        'username'     => 'required|max:32|unique:users',
        'email'        => 'required|email|max:128|unique:users',
        'first_name'   => 'required',
        'last_name'    => 'required',
        'phone_number' => 'regex:/^([0-9's'-'+'(')'.]*)$/',
    ]);
    $profile = UserProfile::create($request->all());
    $user->profile()->associate($profile);
    $user->save();
    return response()->json([
        'message' => trans('user.updated'),
    ]);
}