Получите конкретные столбцы, используя функцию «with ()» в Laravel Eloquent

У меня две таблицы. User и Post Один User имеет много posts и одно post принадлежит только одному user .

В моей модели User меня есть hasMany отношение, как

 public function post(){ return $this->hasmany('post'); } 

И в моей модели по belongsTo меня есть отношение, подобное

 public function user(){ return $this->belongsTo('user'); } 

Теперь я хочу объединить эти две таблицы, используя Eloquent with() но хочу, чтобы определенные столбцы из второй таблицы. Я знаю, что могу использовать query Builder но я не хочу этого использовать. Когда в post модели я пишу

 public function getAllPosts() { return Post::with('user')->get(); } 

Он работает после очередей

 select * from `posts` select * from `users` where `users`.`id` in (<1>, <2>) 

Но я хочу

 select * from `posts` select id,username from `users` where `users`.`id` in (<1>, <2>) 

Когда я использую

 Post::with('user')->get(array('columns'....)); 

Он возвращает столбец только из первой таблицы. Я хочу, чтобы определенные столбцы использовались with() из второй таблицы. Как я могу это сделать?

Я нашел решение. Это можно сделать, передав функцию closure with() качестве второго индекса массива, например

  Post::with(array('user'=>function($query){ $query->select('id','username'); }))->get(); 

Он будет выбирать только id и username из другой таблицы. Надеюсь, это поможет другим.


Помните, что первичный ключ (id в этом случае) необходим в $ query-> select () для фактического получения необходимых результатов.

В вашей модели Post

 public function user() { return $this->belongsTo('User')->select(array('id', 'username')); } 

Оригинальный кредит отправляется в Laravel Eager Loading – Загрузка только определенных столбцов

Когда вы идете в другую сторону (hasMany):

 User::with(array('post'=>function($query){ $query->select('id','user_id'); }))->get(); 

Не забудьте включить внешний ключ (при условии, что он является user_id в этом примере), чтобы разрешить взаимосвязь, иначе вы получите нулевые результаты для своего отношения.

В вашей модели Post :

 public function userWithName() { return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name')); } 

Теперь вы можете использовать $post->userWithName

Вы можете сделать это в Laravel 5.5:

 Post::with('user:id,username')->get(); 

Уход за поле id указанным в документах :

При использовании этой функции вы всегда должны указывать столбец id в списке столбцов, которые вы хотите получить.

Обратите внимание, что если вам нужен только один столбец из таблицы, то использование «списков» довольно хорошо. В моем случае я извлекаю любимые статьи пользователя, но мне нужен только идентификатор статьи:

 $favourites = $user->favourites->lists('id'); 

Возвращает массив идентификаторов, например:

Массив ([0] => 3 [1] => 7 [2] => 8)

Теперь вы можете использовать метод pluck в экземпляре Collection :

Это вернет только атрибут uuid Post model

 App\Models\User::find(2)->posts->pluck('uuid') => Illuminate\Support\Collection {#983 all: [ "1", "2", "3", ], }