2016-03-14 2 views
3

Я использую привязку модели маршрута, чтобы получить экземпляр пользователя, а затем обновить его, если проверка прошла, а затем обновить связанное отношение к отношениям между пользователем и профилем, но я продолжаю получать ошибку , Обновление происходит у Пользователя, но не выполняется обновление профиля. Из того, что я понял из документов, это кажется правильным. Я могу получить доступ к данным профиля, используя $user->profile, поэтому отношения выглядят нормально в моделях User и UserProfile.Laravel 5.2 Использование Associate для обновления привязок к отношениям

Может кто-нибудь увидеть, что случилось с этим контроллером действия:

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'); 
} 

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); 
+0

Вы должны связать модель экземпляра профиль. –

+0

Не могли бы вы показать функцию profile(), на всякий случай ... – sniels

+0

Привет @sniels, я просто обновил вопрос с помощью отношений модели. – mtpultz

ответ

1

Вы должны получить или создать новый profile объект первым и поместить его в $profile. Кроме того, у вас есть один-к-одному отношения здесь, так что вы должны сохранить профиль вашего пользователя, как это:

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

+0

Привет, я обновил свой вопрос с добавлением 'new UserProfile ($ request-> all());', но я все еще, похоже, получаю ту же ошибку. – mtpultz

+1

Здесь ваш профиль и пользователь должны иметь идентификатор. Сначала попробуйте получить существующий профиль: '$ profile = Profile :: where ('user_id', $ user-> id) -> first()' –

+1

Вы обновили код и, похоже, у вас есть отношение «один-к-одному» , поэтому вы должны сохранить его с помощью: '$ user-> profile() -> save ($ profile);' –

0

Изменить код для этого:

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'), 
    ]); 
} 
+0

Привет, похоже, создается новая запись в профиле, когда она уже существует. – mtpultz

Смежные вопросы