2016-03-14 70 views
3

我使用路由模型綁定獲取用戶實例,然後更新它,如果驗證通過,然後更新關聯的屬於用戶和配置文件之間的關係,但我不斷收到錯誤。更新發生在用戶上,但無法更新配置文件。從我從文檔中瞭解的情況來看,這似乎是正確的。我可以使用$user->profile訪問配置文件數據,因此User和UserProfile模型中的關係似乎沒問題。Laravel 5.2使用關聯更新屬於關係

有人能看到什麼是錯與此控制器操作:

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

你應該模型實例相關聯個人資料。 –

+0

你可以顯示profile()函數,以防萬一... – sniels

+0

Hi @sniels,我剛更新了模型關係的問題。 – mtpultz

回答

1

您必須檢索或先創建新profile實體,並把它放在$profile。此外,你必須一比一的關係在這裏,所以你應該保存用戶的個人資料如下:

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

+0

嗨,我更新了我的問題,增加了新的UserProfile($ request-> all());',但我似乎仍然得到相同的錯誤。 – mtpultz

+1

在這裏,你的個人資料和用戶應該有一個ID。嘗試先檢索現有配置文件:'$ 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