Проблема с цепочками отношений в Laravel

У меня есть три модели и отношения. Сообщение, профиль пользователя, пользователь. Мне нужно получить значение столбца имени из таблицы пользователей, но мне нужно просмотреть сообщения и профиль пользователя, чтобы получить его. Сообщения связаны с профилем пользователя, а профиль пользователя связан с пользователями. Я попробовал $post->userProfile()->user()->name, но это не сработает. я получаю сообщение об ошибке

Call to undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsTo::user()

Вот мой код. Любая помощь приветствуется.

Post.php

в таблице сообщений есть столбец user_profile_id

public function userProfile()
{
    return $this->belongsTo(UserProfile::class);
}

Профиль пользователя.php

public function user()
{
    return $this->belongsTo(User::class, 'id');
}

public function posts()
{
    return $this->hasMany(Post::class);
}

Пользователь.php

public function profile()
{
    return $this->hasOne(UserProfile::class, 'id');
}

Что такое $posts? Отдельный пост или сборник?

Lessmore 14.12.2020 17:35

@Lessmore Отдельный пост.

mrmar 14.12.2020 17:38

Что произойдет, если profile() изменится на userProfile() в User.php

Lessmore 14.12.2020 17:41

Не используйте скобки, используйте $post->userProfile->user->name

Giacomo M 14.12.2020 17:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы хотели бы использовать динамические свойства для доступа к фактической разрешенной связи (модели или коллекции), а не к методам связи:

$post->userProfile->user->name

Это предполагает, что эти отношения настроены правильно и существуют в базе данных.

Если вы используете PHP8, вы можете использовать экзистенциальный оператор, чтобы избежать проблемы с возвратом отношений null и вызовом методов для этого:

$post->userProfile?->user?->name

Пожалуйста, попробуйте это.

// Lets get the post having id 1
$post = Post->find(1);
$post->userProfile->user->name;

Когда вы используете круглые скобки, вы получите сами отношения Eloquent, а не результаты этих отношений.

$post->userProfile();

Если вы хотите получить информацию о профиле пользователя этого сообщения с помощью круглых скобок, используйте этот код.

$post->userProfile()->get(); //or
$post->userProfile()->first();

Другие вопросы по теме