Пользовательский запрос отношения hasMany с помощью select()

#laravel #eloquent

#ларавель #красноречивый

Вопрос:

Каждая компания в моем приложении может хранить свои собственные события.

Компания и ее события связаны следующими hasMany отношениями:

 /**
 * The events that belong to the company.
 */
public function events()
{
    return $this->hasMany('AppEvent');
}
 

Чтобы перечислить события компании, я использую:

 Auth::user()->company->events
 

Поскольку каждое событие хранит много данных, которые мне не нужны при запросе hasMany , я хотел бы настроить связь так, чтобы выбирать только id name столбцы и, а не всю строку целиком.

Мой hasMany запрос на отношения будет выглядеть примерно так

 DB::table('events')->where('company_id', Auth::id())->select('id', 'name')->get();
 

Как мне взять коллекцию, возвращенную из этого результата, и использовать ее в качестве запроса для моего hasMany отношения, которое затем правильно вернет коллекцию экземпляров событий?

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

1. Пожалуйста, покажите нам код вашего events метода из модели компании, я бы предложил добавить ->select('id', 'name') часть внутри метода отношений.

2. @ZakariaAcharki Я отредактировал свой вопрос, чтобы включить код events метода.

Ответ №1:

Добавьте фильтр внутри вашего events метода, например :

 public function events()
{
    return $this->hasMany('AppEvent')->select('id', 'company_id', 'name');
}
 

Затем вызовите его следующим образом:

 Auth::user()->company->events
 

Важное обновление: ‘company_id’ необходим для ссылки company-> events, в противном случае отношение ‘events’ всегда возвращает пустой массив

Ответ №2:

Как насчет
Auth::user()->company()->with('events:id,name')->get();

https://laravel.com/docs/5.8/eloquent-relationships#eager-loading

Перейдите к загрузке определенных столбцов