В Laravel 5.2 я пытаюсь загрузить пользователя вместе с его настройками пользователя следующим фрагментом кода: App\User::with('usersettings')->get()
, но это не удается, и я не могу понять, почему. Это данная ошибка.
BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::usersettings()'
я прочел документы по Laravel и я много смотрел Laracasts, и это работало раньше, поэтому я понял, что мне не хватает чего-то очень маленького и, вероятно, очевидного.
User.php
<?php
namespace App;
/* User with fields: id, email */
class User extends Illuminate\Database\Eloquent\Model {
protected $table = 'users';
public function usersettings() {
return $this->hasOne("App\Usersettings", "userid");
}
}
Usersettings.php
<?php
namespace App;
/* Settings with fields: id, userid, textcolor */
class Usersettings extends Illuminate\Database\Eloquent\Model {
protected $table = 'usersettings';
public function user() {
return $this->belongsTo('App\User', 'userid');
}
}
// Редактировать: я уже пробовал нижний регистр s. Эта опечатка могла быть скрытой при копировании в SO, но ошибка была и есть, даже после исправления.
//Редактировать:
<?php
namespace App;
use App\UserSettings;
class User extends Illuminate\Database\Eloquent\Model {
protected $table = 'users';
public function settings() {
return $this->hasOne(UserSettings::class, "userid");
}
}
Если я бегу php artisan tinker
>>> App\User::with('settings')->get()
работает как положено, но ниже
<?php
namespace App;
use App\UserSettings;
class User extends Illuminate\Database\Eloquent\Model {
protected $table = 'users';
public function usersettings() {
return $this->hasOne(UserSettings::class, "userid");
}
}
дает BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::usersettings()'
когда я бегу php artisan tinker
>>> App\User::with('usersettings')->get()
, Аналогично, когда я переименую метод в abc
и беги php artisan tinker
>>> App\User::with('abc')->get()
(что тоже не получается)
Вы опечатали при определении отношения на модели User:
public function usersettings() {
return $this->hasOne("App\Usersettings", "userid");
}
Я хотел бы предложить некоторые очистки:
назовите таблицы ‘users’ и ‘user_settings’,
переименуйте поле ‘userid’ в ‘user_id’,
переименуйте модель «Usersettings» в «UserSettings».
Таким образом, вам не нужно явно определять имена таблиц и внешние ключи, потому что вы следуете соглашениям, и Laravel может их «угадать».
Вы также можете переименовать отношение «usersettings ()» в «settings ()», поскольку очевидно, что это пользовательские настройки. Затем вы можете получить его как: ‘User :: with (‘ settings ‘) -> get ()’.
Других решений пока нет …