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的字段!我是拉雷维尔的新手,这个解决方案让我大吃一惊。谢谢