Вызов метода undefined 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);
}
Ответы
Ответ 1
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, связанную с текущим пользователем, если этот пользователь уже существует.
Надеюсь, это поможет.
Глен
Ответ 2
Измените hasOne
на belongsTo
. Он будет выглядеть так:
class User extends Eloquent {
public function userinfo()
{
return $this->belongsTo('Userinfo');
}
}
class Userinfo extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}
Ответ 3
Вам нужно указать поле, подобное этому:
public function profile()
{
return $this->hasOne('App\AdmProfile', 'id');
}
Ответ 4
Я застрял в этой проблеме в течение нескольких дней, и это оказалось довольно простым для решения. Я создал папку под названием "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,
Надеюсь, это поможет!