Получите конкретные столбцы с помощью функции "with()" в Laravel Красноречивый
У меня есть две таблицы 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>)
Но я хочу
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Когда я использую
Post::with('user')->get(array('columns'....));
Он возвращает только столбец из первой таблицы. Мне нужны конкретные столбцы с использованием with()
из второй таблицы. Как я могу это сделать?
8 answers
Что ж, я нашел решение. Это можно сделать, передав функцию closure
в with()
в качестве второго индекса массива, например
Post::with(array('user'=>function($query){
$query->select('id','username');
}))->get();
Он выберет только id
и username
из другой таблицы. Я надеюсь, что это поможет другим.
Помните, что первичный ключ (в данном случае идентификатор) необходим в $query->select() для фактического получения необходимых результатов.
В вашей Post
модели
public function user()
{
return $this->belongsTo('User')->select(array('id', 'username'));
}
Первоначальный кредит принадлежит Laravel Нетерпеливая загрузка - Загружает только определенные столбцы
Когда идешь в другую сторону (Хасмани):
User::with(array('post'=>function($query){
$query->select('id','user_id');
}))->get();
Не забудьте включить внешний ключ (предполагая, что в этом примере это идентификатор пользователя) для разрешения отношений, в противном случае вы получите нулевые результаты для вашего отношения.
В 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
)
Теперь вы можете использовать метод pluck
для экземпляра Collection
:
Это вернет только атрибут uuid
Post model
App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
all: [
"1",
"2",
"3",
],
}