yajra datatable фрактал удалить ключ данных из включенных атрибутов
Я хочу использовать https://github.com/yajra/laravel-datatables-fractal для преобразования ответа на стороне сервера с помощью Fractal.
Сначала я написал трансформатор для Product
модель как это:
class ProductTransformer extends TransformerAbstract
{
protected $availableIncludes = [
'prices'
];
public function transform(Product $product)
{
$transforms = [
'product_id' => $product->product_id,
'code' => $product->code,
'title' => $product->title,
'description' => $product->description,
];
return $transforms;
}
public function includePrices(Product $product)
{
$prices = $product->prices;
return $this->collection($prices, new PriceTransformer, FALSE);
}
}
Как вы можете видеть, есть включенный prices
атрибут, который использует другой преобразователь с именем PriceTransformer
,
И в ProductController
что делает и возвращает результат всех продуктов в виде отформатированного ответа с датой у меня есть datatable
метод как это:
public function datatable(Request $request)
{
return app('datatables')->of(Product::all())
->setTransformer(new ProductTransformer)
// ->setSerializer(new CustomArraySerializer())
->make(TRUE);
}
Ответ возвращается, но у меня есть проблема: когда я хочу вернуться prices
включенный атрибут, он возвращается как data
атрибут, как это:
{
"draw": 0,
"recordsTotal": 8,
"recordsFiltered": 8,
"data": [
{
"product_id": 1,
"title": "Product Title 1",
"for_sale": true,
"for_purchase": true,
"changeable": false,
"returnable": false,
"sale_price": "40000.00",
"purchase_price": "5000.00",
"creator": 1,
"created_at": "2017-12-11 12:21:49",
"updated_at": "2017-12-14 11:55:52",
"prices": {
"data": [
{
"sale_price": "30000.00",
"created_at": "2017-12-11 12:21:49"
},
{
"sale_price": "40000.00",
"created_at": "2017-12-11 12:39:00"
},
]
}
},
{
"product_id": 11,
"title": "Product Title 11",
"for_sale": true,
"for_purchase": true,
"changeable": false,
"returnable": false,
"sale_price": "50000.00",
"purchase_price": "40000.00",
"creator": 1,
"created_at": "2017-12-16 11:07:43",
"updated_at": "2017-12-16 11:07:43",
"prices": {
"data": [
{
"sale_price": "50000.00",
"created_at": "2017-12-16 11:07:43"
}
]
}
}
],
"input": {
"include": "prices"
}
}
я хочу удалить data
из включенных атрибутов, и они будут в этом формате, например:
"prices": [
{
"sale_price": "50000.00",
"created_at": "2017-12-16 11:07:43"
}
]
Даже я добавил сериализатор (как вы видите в коде выше и прокомментирован) с содержанием ниже, что я использовал его для всех других ответов и работал хорошо:
class CustomArraySerializer extends ArraySerializer
{
public function collection($resourceKey, array $data)
{
if ($resourceKey === FALSE) {
return $data;
}
return ['success' => TRUE, 'result' => $data];
}
public function item($resourceKey, array $data)
{
if ($resourceKey === FALSE) {
return $data;
}
return ['success' => TRUE, 'result' => $data];
}
}
Но при использовании я получил эту ошибку:
{
"draw": 0,
"recordsTotal": 8,
"recordsFiltered": 0,
"data": [],
"error": "Exception Message:\n\nUndefined index: data"
}
Что такое проблема и как ее решить?
1 ответ
Я использую Spatie/Transformer " https://github.com/spatie/laravel-fractal", попробуйте использовать следующее после добавления вышеупомянутого пакета.
public function datatable(Request $request)
{
return app('datatables')->of(Product::all())
->setTransformer(new ProductTransformer)
->serializeWith(new \Spatie\Fractalistic\ArraySerializer())
->make(TRUE);
}