Search code examples
phpjsonlaraveleloquentlaravel-collection

Return selected keys in collection for json


I have this data in method of controller as you see I deleted some keys in method:

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

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

and the api response returns this:

{
    "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"
                    }
                }
            ]
        }
    ]
}

now my problem is that I do not want to return some keys, like labalable_id and labelable_type in pivot and created_at in labels, please offer me the best way


Solution

  • You can use the makeHidden method for hiding data to JSON. Haven't tried this code but, i think it should work.

    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');
    });