Получите конкретные столбцы с помощью функции "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() из второй таблицы. Как я могу это сделать?

Author: tisuchi, 2013-11-08

8 answers

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

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

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


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

 220
Author: Awais Qarni, 2016-01-28 23:25:36

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

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

Первоначальный кредит принадлежит Laravel Нетерпеливая загрузка - Загружает только определенные столбцы

 59
Author: user1669496, 2017-05-23 12:18:20

Когда идешь в другую сторону (Хасмани):

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

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

 42
Author: Thijs, 2015-08-24 15:05:51

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

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

Позаботьтесь о поле id, как указано в документах :

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

 26
Author: Adam, 2017-11-11 13:12:03

В Laravel 5.6 вы можете вызвать определенное поле следующим образом

$users = App\Book::with('author:id,name')->get();
 10
Author: hendra1, 2018-02-24 09:33:22

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

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

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

 9
Author: Duy Hoang, 2016-11-08 09:44:39

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

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

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

Array
(
    [0] => 3
    [1] => 7
    [2] => 8
)
 3
Author: omar j, 2018-01-14 11:03:45

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

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

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }
 0
Author: Giovanni Far, 2017-05-20 00:12:12