Php Laravel 5.2使用Associate更新BelongsTo关系

Php Laravel 5.2使用Associate更新BelongsTo关系,php,laravel,laravel-5,laravel-5.2,Php,Laravel,Laravel 5,Laravel 5.2,我正在使用路由模型绑定来获取一个用户实例,然后在验证通过时更新它,然后更新用户和概要文件之间的关联的“属于”关系,但我一直得到一个错误。更新发生在用户身上,但更新配置文件失败。据我从文件中了解,这似乎是正确的。我可以使用$user->Profile访问配置文件数据,因此在用户和用户配置文件模型中,关系似乎正常 任何人都可以看到控制器操作的错误: public function update(Request $request, User $user) { $this->validat

我正在使用路由模型绑定来获取一个用户实例,然后在验证通过时更新它,然后更新用户和概要文件之间的关联的“属于”关系,但我一直得到一个错误。更新发生在用户身上,但更新配置文件失败。据我从文件中了解,这似乎是正确的。我可以使用
$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()->保存($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'),
    ]);
}

您应该关联profile的一个模型实例。能否显示profile()函数,以防万一……您好@sniels,我刚刚用模型关系更新了这个问题。@mtpultz在文档中,我看到您对“belongsTo”关系使用了“associate”方法。因此,我认为您可能需要交换
$this->hasOne
$this->belongsTo
。或通过配置文件关联:
$profile->user()->associate($user)
。嗨,我更新了我的问题,添加了
新的用户配置文件($request->all()),但我似乎仍然收到相同的错误。在这里,您的配置文件和用户应该有一个ID。请首先尝试检索现有配置文件:
$profile=profile::where('user\u ID',$user->ID)->first()
您已经更新了代码,并且似乎只有一个关系,因此您应该使用以下命令保存它:
$user->profile()->save($profile)
在某个时候没有模型的
fill()
,这样我就可以进入
$profile=profile::where('user\u id',$user->id)->first()然后
$profile->fill($request->all())
然后
$user->profile()->save($profile)
,但似乎您必须
$profile->first\u name='test'
等然后保存。是的,您可以使用批量分配。您应该首先填充$fillable数组:您好,这似乎是在配置文件中创建一个新记录,而该记录已经存在。