#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.php4. Не используйте круглые скобки, используйте $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();