在Laravel 6中,select()和/或Pull()是否已被破坏?
以下代码不会提取所选在Laravel 6中,select()和/或Pull()是否已被破坏?,laravel,eloquent,laravel-query-builder,Laravel,Eloquent,Laravel Query Builder,以下代码不会提取所选用户记录的名称列。而是返回整行。在我做一个可重新创建的示例之前:这是预期的行为吗 我希望显式地跨连接选择列,以减少JSON负载大小,并将嵌套的模型层次结构返回给客户端 我应该补充一点,在同一行上使用pulk()函数时,我也遇到了同样的行为。也许我做错了什么 有大量的例子显示了早期版本的Laravel的这种方法第6版可能已破坏此功能。 $query = Post::whereHas('user.address', function ($query) use ($lat, $lo
用户
记录的名称列。而是返回整行。在我做一个可重新创建的示例之前:这是预期的行为吗
我希望显式地跨连接选择列,以减少JSON负载大小,并将嵌套的模型层次结构返回给客户端
我应该补充一点,在同一行上使用pulk()
函数时,我也遇到了同样的行为。也许我做错了什么
有大量的例子显示了早期版本的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',
]);
pluck()
是一种收集方法,它执行查询并返回指定字段的简单收集对象
在子查询生成器中使用pluck()
执行它(不返回任何内容,因为您将其赋值为nothing),而$query
变量未被修改,其行为与返回所有列的正常行为相同
如果要在此查询中转储pluck()
的值,您将看到它是一个名称数组,因此,它对查询本身没有影响
'user'=>函数($query){
dd($query->pull('name'));
}
select()
在这种情况下应该可以正常工作。您只需要提供关系键,否则它只会返回null对象
'user'=>函数($query){
$query->select(['id','name']);
},
pluck()
是一种收集方法,它执行查询并返回指定字段的简单收集对象
在子查询生成器中使用pluck()
执行它(不返回任何内容,因为您将其赋值为nothing),而$query
变量未被修改,其行为与返回所有列的正常行为相同
如果要在此查询中转储pluck()
的值,您将看到它是一个名称数组,因此,它对查询本身没有影响
'user'=>函数($query){
dd($query->pull('name'));
}
select()
在这种情况下应该可以正常工作。您只需要提供关系键,否则它只会返回null对象
'user'=>函数($query){
$query->select(['id','name']);
},
尝试使用此符号Post::with('user:id,name')->get()
根据上面的注释,您必须在查询中包含关系键,否则它将不返回任何内容。您还可以研究序列化方法来修剪JSON输出,而不是编写复杂的查询。尝试使用这种表示法Post::with('user:id,name')->get()
根据上面的注释,您必须在查询中包含关系键,否则它将不返回任何内容。您还可以研究序列化方法来修剪JSON输出,而不是编写复杂的查询。Hi@Darryl,确认包含关系密钥是解决方案。非常感谢。关于您对序列化的评论:我倾向于使用复杂的查询来最小化垃圾收集器和序列化程序的压力。我不希望内存中的属性比需要的更多。我太快标记了此属性。不幸的是,它不适用于嵌套关系,如user.address
,从原始代码中,您需要确保选择地址id和城市id,并且根据(我假设您正在使用的)Laravel地理文档,select()
需要在distance()之前
call.Hi@Darryl,确认包含关系密钥是解决方案。非常感谢。关于您对序列化的评论:我倾向于使用复杂的查询来最小化垃圾收集器和序列化程序的压力。我不希望内存中的属性比需要的更多。我太快标记了此属性。不幸的是,它不适用于嵌套关系,如user.address
,从原始代码中,您需要确保选择地址id和城市id,并且根据(我假设您正在使用的)Laravel地理文档,select()
需要在distance()之前
打电话。