2016-04-04 22 views
0

Lange Zeit lurker, zum ersten Mal Poster. Ich benutze Laravel 5.2 für ein Projekt, an dem ich gerade arbeite. Hat jemand irgendwelche Tipps, wie ich Laravel nutzen kann, um diese Schleife schneller laufen zu lassen?Wie kann ich diese Schleife schneller machen?

foreach ($purchaseYears as $purchaseYear){ 

$totalInventory = \App\Inventory::where('purchase_year', $purchaseYear)->count(); 

if ($purchaseYear < 1960) { $purchaseYear = 'Pre 1960'; } 
else if ($purchaseYear >= 1960 && $purchaseYear < 1965) { $purchaseYear = '1960-64'; } 
else if ($purchaseYear >= 1965 && $purchaseYear < 1970) { $purchaseYear = '1965-69'; } 
else if ($purchaseYear >= 1970 && $purchaseYear < 1975) { $purchaseYear = '1970-74'; } 
else if ($purchaseYear >= 1975 && $purchaseYear < 1980) { $purchaseYear = '1975-79'; } 
else if ($purchaseYear >= 1980 && $purchaseYear < 1985) { $purchaseYear = '1980-84'; } 
else if ($purchaseYear >= 1985 && $purchaseYear < 1990) { $purchaseYear = '1985-89'; } 
else if ($purchaseYear >= 1990 && $purchaseYear < 1995) { $purchaseYear = '1990-94'; } 
else if ($purchaseYear >= 1995 && $purchaseYear < 2000) { $purchaseYear = '1995-99'; } 
else if ($purchaseYear >= 2000 && $purchaseYear < 2005) { $purchaseYear = '2000-04'; } 
else if ($purchaseYear >= 2005 && $purchaseYear < 2010) { $purchaseYear = '2005-09'; } 
else if ($purchaseYear >= 2010 && $purchaseYear < 2015) { $purchaseYear = '2010-14'; } 
else if ($purchaseYear >= 2015 && $purchaseYear < 2019) { $purchaseYear = '2015-19'; } 

if (isset($chartData[$purchaseYear])) { 
    $prev = $chartData[$purchaseYear]; 
    $chartData[$purchaseYear] = $totalInventory + $prev; 
    $prev = null; 
} else { 
    $chartData[$purchaseYear] = $totalInventory; 
} 

} 
+1

Sie könnten 'WhereIn' verwenden, so dass Ihre Abfrage nur einmal ausgeführt werden müsste, und dann die Ergebnisse durchlaufen. –

+0

Ich werde es versuchen. Vielen Dank! – David

Antwort

0

Ich glaube, der zeitaufwendigste Teil sollte die Abfrage ausführen. Wenn Sie whereIn verwenden, dann denke ich, dass Sie die Abfrage nur einmal ausführen und dann die Ergebnisse durchlaufen können. Ich habe es nicht getestet, aber es sollte wie folgt sein:

$purchasesByYear = \App\Inventory::select('purchase_year', 
    DB::raw('count(*) as purchase_count')) 
     ->whereIn('purchase_year', $purchaseYears) 
     ->groupBy('purchase_year')->get(); 

Ich denke, die Anzahl der Abfrage Hinrichtung zu reduzieren wird die beste Möglichkeit, dies langsam vom Laufen zu halten. Außerdem denke ich, dass das Hinzufügen eines Indexes zu purchase_year hilfreich sein kann, wenn Sie dies noch nicht getan haben.

Anstelle von vielen anderen Bedingungen, um die Jahre zu gruppieren, könnten Sie etwas Mathe verwenden. Dies könnte tatsächlich etwas langsamer sein, aber der Code wäre etwas weniger repetitiv, und ich glaube, dass alles, was Sie mit diesem Teil tun, eine Mikrooptimierung im Vergleich zu dem ist, was Sie mit dem Abfrageteil tun können. Mein Vorschlag:

foreach ($purchasesByYear as $purchaseYear) { 
    $year = $purchaseYear->purchase_year; 
    if ($year < 1960) { 
     $yearRange = 'Pre 1960'; 
    } else { 
     // subtract one until the year is a multiple of five 
     while ($year % 5) { $year--; } 
     // then construct the range string using the starting number 
     $yearRange = $year.'-'.($year+4); 
    } 
    if (isset($chartData[$yearRange])) { 
     $chartData[$yearRange] += $purchaseYear->purchase_count; 
    } else { 
     $chartData[$yearRange] = $purchaseYear->purchase_count; 
    } 
} 
+0

Ich stimme zu. Die Inventar-Tabelle jedes Mal zu schlagen, wenn die Schleife rollt, ist ziemlich hässlich. Vielen Dank - ich werde am Morgen einen Wirbel machen. – David

0

ich glaube, Sie die Daten in ein Muster zu brechen, anstatt nur testting für jedes Jahrzehnt, so etwas wie diese:

if ($purchaseYear < 1960) { 
    $purchaseYear = 'Pre 1960'; 
} else { 
    $prefix = substr($purchaseYear,0,2); 
    $decade = substr($purchaseYear,1,1); 
    $suffix = substr($purchaseYear,-1); 
    $purchYear = $prefix . $decade 
    if ($suffix<5) { 
     $purchYear .= '0-' . $decade . '4'; 
    } else { 
     $purchYear .= '5-' . $decade . '9' 
} 

habe nicht getestet, aber ich denke, es wird tun, was Du würdest mögen.

+0

Ich werde das nächste versuchen. Danke für Ihre Hilfe! – David

Verwandte Themen