1-я ошибка: неправильное определение взаимосвязи
Отношения Laravel двунаправлены. В отношениях one-to-one
вы можете определить прямую связь (HasOne
) и обратную связь (BelongsTo
)
Прямая связь должна быть:
HasOne HasOne
[ Login ] <----------- [ Data ] <----------- [ IP ]
И обратное соотношение должно быть:
BelongsTo BelongsTo
[ Login ] -----------> [ Data ] -----------> [ IP ]
См. Eloquent: отношения - один-к-одному документы для деталей о том, как его определить.
Обратите внимание , что вам не нужно определять оба направления для отношений, если вам это не нужно. В вашем случае, я думаю, вам просто нужно определить направление belongsTo
.
2-я ошибка: вы вызываете метод отношений, а не сами отношения
Когда вы делаете:
Login::find(1)->data()->ip()->get();
Вы вызываете метод data
, который определяет ваши отношения, а не связанную модель. Это полезно в некоторых случаях, но не в вашем случае.
Вместо этого вызывайте магическое свойство отношения:
Login::find(1)->data->ip;
Обратите внимание, что мы не используем ()
и нам не нужен get()
здесь. Laravel позаботится о том, чтобы загрузить его для нас.
Использовать Eager Loading
Laravel Eloquent имеет Eager Loading для отношений, которые очень полезны в некоторых случаях, потому что они предварительно загружают ваши отношения и уменьшают количество выполняемых вами запросов.
В описанной вами ситуации (загрузка одной модели Login
) это не приводит к повышению производительности, но также не замедляет работу.
Это полезно, когда вы загружаете много моделей, поэтому уменьшает количество запросов к базе данных с N+1
до 2
.
Представьте, что вы загружаете 100 Login
моделей, без какой-либо активной загрузки, вы сделаете 1 запрос, чтобы получить ваши Login
модели, 100 запросов, чтобы получить Data
модели, и более 100 запросов, чтобы получить * 1054. * модели.
При активной загрузке он выполнит только 3 запроса, что приведет к значительному увеличению производительности.