Были ли выбраны select () и / или pluck () в Laravel 6? - PullRequest
0 голосов
/ 07 марта 2020

Следующий код не выбирает столбец имени выбранной записи user. Скорее возвращает всю строку. Прежде чем я приведу воссоздаемый пример: это ожидаемое поведение здесь?

Я хочу явно выбрать столбцы по объединениям, чтобы уменьшить размер JSON полезной нагрузки и вернуть иерархию вложенной модели моим клиентам.

Я должен добавить, что Я испытываю такое же поведение при использовании функции pluck() на той же строке. Возможно, я сделал что-то не так.

Существует множество примеров, демонстрирующих этот подход с более ранними версиями Laravel. Версия 6, возможно, сломала это.

$query = Post::whereHas('user.address', function ($query) use ($lat, $lon, $distance) {
    $query->distance($lat, $lon, $distance);
})->with([
    'user' => function ($query) {    
        $query->select('name'); // TODO: Report this bug. I've also tried pluck()
    },
    'user.address' => function ($query) use ($lat, $lon, $distance) {
        $query->distance($lat, $lon, $distance);
    },
    'user.address.city',
    'bids' => function ($query) {
        $query->orderBy('amount', 'DESC');
    },
    'bids.user',
    'images',
]);

1 Ответ

2 голосов
/ 07 марта 2020

pluck() - это метод коллекции, он выполняет запрос и возвращает простой объект коллекции из указанного вами поля.

Использование pluck() внутри вашего построителя подзапроса выполняет его (ничего не возвращая, потому что вы ничего не назначаете), в то время как переменная $query не изменяется и ведет себя как обычно, возвращая все столбцы.

Если бы вы сбросили значение pluck() внутри этого запроса, вы бы увидели, что это массив только имен, и поэтому он не влияет на сам запрос.

'user' => function ($query) {    
        dd($query->pluck('name'));
    }

select() должно нормально работать в этом случае. Вам просто нужно также предоставить ключ отношения, иначе он просто вернет нулевой объект.

'user' => function ($query) {    
        $query->select(['id', 'name']); 
    },
...