首页 > 解决方案 > Laravel 6 中的 select() 和/或 pluck() 是否被破坏?

问题描述

以下代码不会提取所选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',
]);

标签: laraveleloquentlaravel-query-builder

解决方案


pluck()是一个集合方法,它执行查询并返回您指定的字段的简单集合对象。

在您的子查询构建器中使用pluck()会执行它(不返回任何内容,因为您没有将其分配给任何内容),而$query变量未修改并且行为正常,返回所有列。

如果您要转储pluck()此查询内部的值,您会看到它是一个仅包含名称的数组,因此,它对查询本身没有影响。

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

select()在这种情况下应该可以正常工作。您只需要提供关系键,否则它只会返回一个空对象。

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

推荐阅读