1

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?

Antwort

1

Ich benutze Spatie/Transformer "spatie/laravel-fractal", versuchen Sie nach dem Hinzufügen oben genannten Paket verwenden.

public function datatable(Request $request) 
{ 
    return app('datatables')->of(Product::all()) 
    ->setTransformer(new ProductTransformer) 
    ->serializeWith(new \Spatie\Fractalistic\ArraySerializer()) 
    ->make(TRUE); 
} 
+0

Ich habe versucht, Ihr Paket und verwendet 'serializeWith' wie Sie vorschlagen, aber dieser Fehler aufgetreten ist jetzt:' Methode serializeWith nicht –

+0

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. –

+0

@ A.B.Developer Ich bin froh, dass Ihr Problem gelöst ist. Vielen Dank. – Mubashar

Verwandte Themen