Получить конкретные столбцы с помощью функции "with ()" в Laravel Eloquent
у меня есть две таблицы User и Post один User много posts и post принадлежит только одной user.
в своем User модели hasMany связи, как
public function post(){
return $this->hasmany('post');
}
а у меня 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>)
но я хочу!--21-->
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
когда я использую
Post::with('user')->get(array('columns'....));
он возвращает только столбец из первой таблицы. Я хочу конкретные столбцы с помощью with() со второго стола. Как я могу это сделать?
8 ответов:
в своем
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 в этом примере) для разрешения отношения, иначе вы получите нулевые результаты для вашего отношения.
Вы можете сделать это так в Laravel 5.5:
Post::with('user:id,username')->get();уход за
idполе, как указано в docs:при использовании этой функции, вы всегда должны включать столбец ID в список столбцов, которые вы хотите получить.
в Laravel 5.6 вы можете вызвать определенное поле, как это
$users = App\Book::with('author:id,name')->get();
в своем
Postмодель:public function userWithName() { return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name')); }Теперь вы можете использовать
$post->userWithName
обратите внимание, что если вам нужен только один столбец из таблицы, то использование "списков" довольно приятно. В моем случае я получаю любимые статьи пользователя, но мне нужен только идентификатор статьи:
$favourites = $user->favourites->lists('id');возвращает массив идентификаторов, например:
Array ( [0] => 3 [1] => 7 [2] => 8 )