У меня две таблицы. 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", ], }