Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: associate ()

Ссылка: Как я могу обновить существующие отношения «Жестокие» в Laravel 4?

$userinfo = \Userinfo::find($id); \User::find($id)->userinfo()->associate($userinfo)->save(); 

Я получаю сообщение об ошибке: Call to undefined method Illuminate\Database\Query\Builder::associate()

Вот весь метод:

 public function saveUser($id) { $user = \User::find($id); $userdata = \Input::all(); $rules = array( 'email' => 'required|email', 'state' => 'size:2', 'zip' => 'size:5', 'phone' => array('regex:/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/') ); $validator = \Validator::make($userdata, $rules); if ($validator->passes()) { if ($userdata['email'] !== $user->email) { $rules = array('email' => 'unique:users'); $validator = \Validator::make($userdata, $rules); if ($validator->fails()) return Redirect::route('admin.user.edit', array('user' => $user)) ->with('error', 'Specified email already exists.'); } $user->email = $userdata['email']; $user->firstname = $userdata['firstname']; $user->lastname = $userdata['lastname']; $userinfoArray = array( 'address' => $userdata['address'], 'city' => $userdata['city'], 'state' => $userdata['state'], 'zip' => $userdata['zip'], 'phone' => preg_replace('/[^0-9]/', '', $userdata['phone']) ); $user->save(); if (!$user->userinfo) { $userinfo = new \Userinfo($userinfoArray); $userinfo = $user->userinfo()->save($userinfo); } else { $userinfo = \Userinfo::find($id); \User::find($id)->userinfo()->associate($userinfo)->save(); //$user->userinfo()->update($userinfoArray); } return \Redirect::route('admin.user.detail', array('id' => $id)) ->with('success', 'User updated.'); } return \Redirect::route('admin.user.edit', array('id' => $id)) ->withInput() ->withErrors($validator); } 

associate () – это метод отношения belongsTo, но, как видно из вышеизложенного, вы пытаетесь вызвать его через отношение hasOne.

Я просто догадываюсь, поскольку вы не предоставили свой красноречивый код класса модели, поэтому не можете видеть, как вы точно установили отношения, но если у вас есть:

 class User extends Eloquent { public function userinfo() { return $this->hasOne('Userinfo'); } } class Userinfo extends Eloquent { public function user() { return $this->belongsTo('User'); } } 

Затем связать нужно вызвать против Userinfo, так как это имеет отношение toTo к которому привязан метод associate ().

Например

 $user = \User::find(4); $userinfo = \UserInfo::find(1); $userinfo->user()->associate($user); $userinfo->save(); 

Будет установлен внешний ключ user_id в таблице user_info для идентификатора объекта $ user.

Глядя на ваш вышеприведенный код, не кажется, что это то, что вы на самом деле пытаетесь сделать, и что

 $user->userinfo()->update($userinfoArray); 

вызов, который вы прокомментировали, фактически сделает то, что вы пытаетесь достичь, а именно обновить userinfo, связанную с текущим пользователем, если этот пользователь уже существует.

Надеюсь это поможет.

лощина

Изменить hasOne belongsTo . Это будет выглядеть так:

 class User extends Eloquent { public function userinfo() { return $this->belongsTo('Userinfo'); } } class Userinfo extends Eloquent { public function user() { return $this->belongsTo('User'); } } 

Вам нужно указать поле, подобное этому:

  public function profile() { return $this->hasOne('App\AdmProfile', 'id'); } 

Я застрял в этой проблеме в течение нескольких дней, и это оказалось довольно простым для решения. Я создал папку под названием «models» в моей папке «app», но я забыл переконфигурировать файл auth.php.

Это была моя ошибка.

 Call to undefined method Illuminate\Database\Query\Builder 

Я исправил это, открыв auth.php в папке config и изменив следующую строку, чтобы включить мою папку моделей.

 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => Foodie\User::class, 

исправить:

 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => Foodie\Models\User::class, 

Надеюсь это поможет!