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

#php #laravel

#php #laravel

Вопрос:

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

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

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

Post.php

в таблице posts есть столбец user_profile_id

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

UserProfile.php

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

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

User.php

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

Комментарии:

1. Что такое $posts ? Один пост или коллекция?

2. @Lessmore один пост.

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

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

Ответ №1:

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

 $post->userProfile->user->name
 

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

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

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

Ответ №2:

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

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

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

$post->userProfile();

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

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