Получить конкретные столбцы с помощью функции "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 )