Ссылка: Как я могу обновить существующие отношения «Жестокие» в 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,
Надеюсь это поможет!