2016-11-14 4 views
0

Im Versuch, meine Daten zu an excel sheet aber ich habe den Fehler zu exportieren:Laravel aus der Erinnerung

FatalErrorException in Connection.php line 321: Allowed memory size of 134217728 bytes exhausted (tried to allocate 196605 bytes)

Ich verstehe ich konnte nur auf die Speichergrenze von PHP aber Ich mag mein Code verstehen, warum so dauert viel Gedächtnis.

Mein Code:

public function exportExcel() 
{ 

    $datum = date("d-m-Y"); 


    Excel::create('Sales export '.$datum, function($excel) { 


     $datum = date("d-m-Y"); 

     // Chain the setters 
     $excel->setCreator('some name') 
      ->setCompany('some company') 
      ->setDescription('sales export.') 
      ->setTitle('Salesexport '.$datum); 

     $excel->sheet('sales '.$datum, function($sheet) { 
      $orders = Order::orderBy('created_at','desc')->get(); 
      $sheet->appendRow(array(
       "merk","product","artikel nr","categorie","collectie","maat","omschrijving","inkoopprijs","verkoopprijs","prijs betaald","aantal verkocht","verkocht aan", "totaal","dag","maand","jaar","kwartaal","reseller","verkoper","bestel naam" 
      )); 
      foreach($orders as $order) 
      { 

       foreach($order->products as $p) 
       { 

        $sizeLink = $p->productSize; 
        $productLink = $sizeLink->product; 


        // Append row as very last 
        $sheet->appendRow(array(
         $productLink->brand->name, 
         $productLink->name, 
         $productLink->artnr, 
         $productLink->category->name, 
         $productLink->collection->name, 
         $sizeLink->size->name, 
         $productLink->desciption, 
         number_format((float) $productLink->price_buy_in, 2, ',', ''), 
         number_format((float) $productLink->price, 2, ',', ''), 
         number_format((float) $p->price, 2, ',', ''), 
         $p->quantity, //geboekt aantal 
         $order->billingname . $order->billingnamelast, 
         number_format((float) $p->quantity * $p->price, 2, ',', ''), // totaal kosten 
         //number_format((float) ($p->quantity * $p->price - $p->quantity * $p->price_buy_in), 2, ',', ''), // winst inkoop-verkoop 
         date("d",strtotime($order->created_at)), 
         date("n",strtotime($order->created_at)), 
         date("Y",strtotime($order->created_at)), 
         ceil(date("m",strtotime($order->created_at))/3), 
         $order->reseller->name, 
         $order->creator, 
         $order->name, 
        )); 
       } 
      } 

      // Auto filter for entire sheet 
      $sheet->setAutoFilter(); 
      $sheet->freezeFirstRow(); 
      // Set black background 
      $sheet->row(1, function($row) { 

       // call cell manipulation methods 
       $row->setBackground('#cccccc'); 
       $row->setFontWeight("bold"); 

      }); 
    $sheet->setColumnFormat(array(
     'G' => \PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00, 
     'H' => '[$EUR ]#,##0.00_-', 
     'I' => \PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00, 
    )); 

     }); 

    })->download('xlsx');; 
} 
+0

Wie viele Zeilen bearbeiten Sie normalerweise hier? –

+0

Bestellungen enthält 135 Zeilen. orderproducts 1350 –

+0

Können Sie die Daten im Cache speichern (täglich um 3 Uhr) und dann versuchen, sie zu exportieren, oder Sie benötigen "frische" Daten? –

Antwort

1

Es scheint, dass Sie versuchen, bei einer gleichzeitig zu viele Prozesse zu verarbeiten, die so viel Arbeitsspeicher nimmt, Sie chunk() Methode der Laravel Sammlung wie folgt verwenden sollte:

Order::orderBy('created_at','desc')->chunk(10, function($orders)use ($sheet) { 
    foreach($orders as $index => $order) { 
     // Do your stuff here... 
    } 
} 

Hoffe, das hilft!

+0

Wird chunk eine limit-Abfrage erstellen oder einfach array_chunk auf die Ergebnismenge anwenden? –

+0

Ich bekomme einen Fehler für die Zeile: foreach ($ Bestellung-> Produkte-> Chunk (10) als $ p) {Sprich "Undefinierte Eigenschaft: Illuminate \ Database \ Eloquent \ Collection :: $ Produkte" –

+0

Die 'Chunk () 'Methoden-Prozess-Code in Chunks, so dass der PHP 10 Sätze gleichzeitig statt 1350 Sätze verarbeitet (wie Sie erwähnt), die große Speicherauslastung vermeidet .. !! –

Verwandte Themen