Ich möchte laravel-datatables-fractal für die Transformation serverseitige Antwort mit Fractal verwenden.yajra datatable Fraktal entfernen Datenschlüssel von enthaltenen Attributen
Zuerst schrieb ich einen Transformator für Product
Modell wie folgt aus:
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);
}
}
Wie man dort sehen kann, ist ein eingeschlossener prices
Attribut, das einen anderen Transformator PriceTransformer
Namen verwendet.
Und in der ProductController
das und gibt Ergebnis aller Produkte als Datentabelle formatiert Antwort macht Ich habe eine datatable
Methode wie folgt:
public function datatable(Request $request)
{
return app('datatables')->of(Product::all())
->setTransformer(new ProductTransformer)
// ->setSerializer(new CustomArraySerializer())
->make(TRUE);
}
Antwort zurückgegeben wird, aber ein Problem, das ich habe, ist: wenn ich will prices
enthalten Attribut zurückzukehren, kehrte er als data
Attribut wie folgt aus:
{
"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"
}
}
ich möchte data
aus enthalten Attribute entfernen und sie b e in diesem Format zum Beispiel:
"prices": [
{
"sale_price": "50000.00",
"created_at": "2017-12-16 11:07:43"
}
]
Auch habe ich einen Serializer (wie Sie in obigem Code sehen und kommentiert) mit folgendem Inhalt, dass ich es für alle andere Reaktionen verwendet und habe gut funktioniert:
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];
}
}
Aber wenn Gebrauch es bekam ich diese Fehlermeldung:
{
"draw": 0,
"recordsTotal": 8,
"recordsFiltered": 0,
"data": [],
"error": "Exception Message:\n\nUndefined index: data"
}
Was Problem ist und wie kann das lösen?
Ich habe versucht, Ihr Paket und verwendet 'serializeWith' wie Sie vorschlagen, aber dieser Fehler aufgetreten ist jetzt:' Methode serializeWith nicht –
nicht exist.' Jetzt habe ich diese Art und Weise und Problem gelöst: '$ products = Produkt :: alle(); $ products = Fraktal() -> Sammlung ($ products) -> transformWith (neu ProductTransformer) -> serializeWith (neu \ Spatie \ Fractalistic \ ArraySerializer()) -> toArray(); return app ('datatables') -> von ($ products) -> make (TRUE); ' Dafür habe ich Ihre Lösung als Antwort markiert. –
@ A.B.Developer Ich bin froh, dass Ihr Problem gelöst ist. Vielen Dank. – Mubashar