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

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
)

теперь вы можете использовать pluckметод Collection например:

это вернет только на Post model

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }