【问题标题】:Returning only one column in json from eloquent relationship using eager loading使用急切加载从雄辩的关系中仅返回 json 中的一列
【发布时间】:2015-02-21 01:03:50
【问题描述】:

我在“产品”模型中有这个来映射产品和条形码之间的一对多关系:

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 是否有一种快速而聪明的方法?

【问题讨论】:

    标签: php json laravel eloquent


    【解决方案1】:

    lists() 可以创建一个数组,其中包含集合中每个模型的一个属性。然而问题是我们必须为模型中关系的每个 result 执行此操作。这意味着您的控制器中有一个循环。 (我们不希望这样)

    相反,您可以在模型中覆盖 toArray()(当您执行 Response::json() 时将调用它)。在下面的代码中,我们用lists() 结果覆盖barcodes

    public function toArray(){
        $array = parent::toArray();
        $array['barcodes'] = $this->barcodes->lists('barcode');
        return $array;
    }
    

    【讨论】:

    • 可爱!我是 Laravel 的新手,这个解决方案让我大吃一惊。谢谢!
    【解决方案2】:

    您可以将闭包传递给with 方法,并使用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 列。
    • 您应该尝试在 Barcode 模型中添加 $visible 属性来定义导出到 JSON/数组的字段。
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2013-09-22
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多