返回JSON集合中的选定键

时间:2018-08-27 05:29:13

标签: php json laravel eloquent laravel-collection

我在控制器的方法中有此数据,如您所见,我删除了方法中的一些键:

$foods = Food::get()->map(function($value){
  return collect($value->toArray())->except('pivot', 'deleted_at', 'created_at', 'updated_at');
});

return HttpHelpers::sendJsonData($foods, 200);

并且api响应返回此:

{
    "success": true,
    "data": [
        {
            "id": 1,
            "title": "food1",
            "default_price": 2353465456,
            "main_meal": 1,
            "labels": [
                {
                    "id": 1,
                    "title": "type1",
                    "type": "food",
                    "created_at": "2018-08-23 03:55:33",
                    "updated_at": "2018-08-23 03:55:33",
                    "pivot": {
                        "labelable_id": 1,
                        "label_id": 1,
                        "labelable_type": "App\\Models\\Panel\\Food"
                    }
                }
            ]
        },
        {
            "id": 2,
            "title": "food2",
            "default_price": 1000,
            "main_meal": 0,
            "labels": [
                {
                    "id": 1,
                    "title": "type2",
                    "type": "food",
                    "created_at": "2018-08-23 03:55:33",
                    "updated_at": "2018-08-23 03:55:33",
                    "pivot": {
                        "labelable_id": 2,
                        "label_id": 1,
                        "labelable_type": "App\\Models\\Panel\\Food"
                    }
                }
            ]
        }
    ]
}

现在我的问题是我不想返回某些键,例如数据透视表中的labalable_id和labelable_type以及标签中的created_at,请提供最佳方法

2 个答案:

答案 0 :(得分:2)

您可以使用makeHidden方法将数据隐藏到JSON。尚未尝试过此代码,但是,我认为它应该可以工作。

https://laravel.com/docs/5.6/eloquent-serialization#hiding-attributes-from-json

$foods = Food::get()->map(function($value){
    foreach($value->labels as $label){
        $label = $label->makeHidden(['created_at']);
        $label->pivot = $label->pivot->makeHidden(['labelable_id', 'labelable_type']);
    }
    return collect($value->toArray())->except('pivot', 'deleted_at', 'created_at', 'updated_at');
});

答案 1 :(得分:0)

如果数据响应是通过存储过程进行的,那么在这种情况下,您需要将数据透视表数据存储在临时表中,然后选择所需的键并通过json中的API显示。