Laravel — Получить отношение belongsTo без идентификатора с помощью Eloquent

#php #laravel #eloquent

#php #laravel #eloquent

Вопрос:

я использую laravel 7.30, у меня есть модель post, связанная с моделью user с отношением belongsTo, я хочу получить все сообщения с пользовательским свойством, которое содержит только имя пользователя для целей api.

что я пробовал до сих пор.

 public function index()
{
    return Post::with('user:id,name')->get();
}
 

но результатом этого кода является вложенный объект «user», который имеет 2 поля id и name в каждом сообщении, мне нужно только одно поле с полями сообщений, называемое user, которое имеет только имя, а не вложенный объект для целей api.

Я сделал это с помощью построителя запросов к базе данных, но я ищу способ с помощью Eloquent

Заранее спасибо

Ответ №1:

Вы можете добавить это в свою Post модель:

 protected $appends = [
    "author_name"
];

public function getAuthorNameAttribute()
{
    return $this->user->name;
}
 

Это гарантирует, что имя пользователя добавляется к Post объекту каждый раз, когда он вызывается.

Затем с вашего контроллера вы можете легко это сделать:

 public function index()
{
    return Post::get();
}
 

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

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

2. Я рад , что смог помочь Закарии Бенали . Пожалуйста, поддержите мой ответ 😊

3. Готово! , работает ли этот метод для вложенных отношений? например сообщение с комментариями можете ли вы получить комментарий с именем пользователя тем же методом

4. Да, это работает и для вложенных отношений, вам просто нужно добавить то же getAuthorNameAttribute() самое и в Comment модель. Вы еще не проголосовали за … пожалуйста, используйте стрелку, указывающую вверх на ответ, чтобы проголосовать за

5. Я проголосовал, но, похоже, мне нужно набрать 15 репутаций, чтобы оно отображалось в сообщениях, я получаю это сообщение «Спасибо за отзыв! Голоса, поданные лицами с репутацией менее 15, записываются, но не изменяют публично отображаемый результат публикации. »