Всегда ли отношение «один к одному» в Laravel всегда нужно сначала ()? - PullRequest
4 голосов
/ 17 января 2020

У меня отношение один к одному между моделями User и UserSettings,

Но (после $user = auth()->user()) при попытке $user->settings()->something выдается ошибка Undefined property.

Прошло, когда я использую $user->settings()->first()->something ...

Мой вопрос, это как это должно работать? или я что-то не так делаю?

Ответы [ 4 ]

4 голосов
/ 17 января 2020

Вы не можете напрямую запустить $user->settings()->something.

Потому что, когда вы вызываете $user->settings(), он просто возвращает Подсветить \ Database \ Eloquent \ Relations \ HasOne объект.

То есть это не объект модели, вам нужно взять объект модели и вызвать его атрибут следующим образом.

$user->settings()->first()->something;

Dynami c Свойства

Поскольку у вас есть отношение один к одному между User и UserSettings.

Если у вас есть индивидуальные отношения в вашей модели пользователя:

public function settings()
{
   return $this->hasOne('App\Models\UserSettings', 'user_id', 'id');
}

Согласно Laravel do c

Как только связь определена, мы можем извлечь связанную запись, используя свойства dynamici c Eloquent . Свойства Dynami c позволяют получить доступ к методам отношений, как если бы они были свойствами, определенными в модели:

Eloquent автоматически загрузит для вас отношение и даже достаточно умен, чтобы знать, вызывать ли метод get (для отношений один-ко-многим) или первый (для отношений один-к-одному). Затем он будет доступен через свойство Dynami c с тем же именем, что и отношение.

Таким образом, вы можете использовать свойства dynamici c * 1045 eloquent * вот так:

$user->settings->something; // settings is the dynamic property of $user.
2 голосов
/ 17 января 2020

Этот код даст вам результат сбора.

$user->settings;

Таким образом, вызов 'нечто' недоступен, или он вернет вам нулевое значение, если вы не получите указанный индекс c.

$user->settings()->something

в то время как этот работает, потому что вы использовали first () для получения первых данных коллекции и доступа к их свойствам.

$user->settings()->first()->something

Первый метод возвращает первый элемент в собрание, которое проходит данный тест на правду, см. здесь документы laravel документы

1 голос
/ 17 января 2020

Если вы хотите, чтобы пользователь settings сам просто сделал это:

$user->settings

Тогда вы можете получить поля настроек следующим образом:

$user->settings->something

Когда вы делаете это $user->settings(), вы можете после этого цепочки запросов. Например,

$user->settings()->where('something', 'hello')->first()

Вот почему выходные данные $user->settings и $user->settings()->first() одинаковы.

0 голосов
/ 17 января 2020

Auth только дает вам информацию о пользователе;

Попробуйте следующий код:

$user = User::find(auth()->user()->id);//and then 
$user->settings->something;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...