Php 使用即时加载从eloquent关系中仅返回json中的一列
我在“产品”模型中使用了此选项,以映射产品和条形码之间的一对多关系:Php 使用即时加载从eloquent关系中仅返回json中的一列,php,json,laravel,eloquent,Php,Json,Laravel,Eloquent,我在“产品”模型中使用了此选项,以映射产品和条形码之间的一对多关系: public function barcodes(){ return $this->hasMany('Barcode', 'productId', 'id')->select(['barcode', 'productId']); } 接下来,这个代码不仅提供了产品,还提供了一系列对象中的每个条形码 public function search(){ $results = Product::with
public function barcodes(){
return $this->hasMany('Barcode', 'productId', 'id')->select(['barcode', 'productId']);
}
接下来,这个代码不仅提供了产品,还提供了一系列对象中的每个条形码
public function search(){
$results = Product::with('barcodes')->where('name', 'LIKE', 'theQueryString')->get();
return Response::json($return);
}
这是一个示例输出:
{
"results": [
{
"id": 1,
"name": "Warehouse Box",
"created_at": "2034-12-14 06:57:52",
"updated_at": "2064-12-14 06:27:52",
"barcodes": [
{
"barcode": "0750028400400",
"productId": 1
},
{
"barcode": "123456789",
"productId": 1
}
]
}
]
}
我希望“条形码”只是一个值数组,而不是返回一个对象数组
换句话说,我想返回每个条形码对象中“条形码”列的值,而不是对象本身
以下是我希望它看起来的样子:
{
"results": [
{
"id": 1,
"name": "Warehouse Box",
"created_at": "2034-12-14 06:57:52",
"updated_at": "2064-12-14 06:27:52",
"barcodes": [
"0750028400400",
"123456789"
]
}
]
}
在Laravel中,有没有一种快速而智能的方法可以使用Eloquent实现这一点?有一种方法可以生成一个数组,其中包含集合中每个模型的一个属性。然而问题是,我们必须对模型中关系的每个结果都这样做。这意味着您的控制器中有一个循环。(我们不希望这样)
相反,您可以在模型中重写toArray()
(在执行Response::json()
时将调用该函数)。在下面的代码中,我们使用lists()
结果覆盖barcode
public function toArray(){
$array = parent::toArray();
$array['barcodes'] = $this->barcodes->lists('barcode');
return $array;
}
您可以使用方法将闭包传递给
,并使用select
方法指定要选择的列:
public function search(){
$results = Product::with(array('barcodes' => function($query) {
return $query->select('barcode');
}))->where('name', 'LIKE', 'theQueryString')->get();
...
然后,您可以使用Laravel的Collection类中提供的collapse
方法:
$results->barcodes = $results->barcodes->collapse();
谢谢你的回复。不幸的是,这没有多大帮助,因为您还必须为外键选择列,在本例中为“productId”。好主意,但这是我遇到的同一个问题。我仍然需要从条形码中删除ID列。您应该尝试在条形码模型中添加$visible
属性,以定义导出到JSON/array.com的字段!我是拉雷维尔的新手,这个解决方案让我大吃一惊。谢谢