2016-04-04 19 views
0

長時間のlurker、初回ポスター。私が取り組んでいるプロジェクトにLaravel 5.2を使用しています。誰かが、このループをより迅速に実行するためにLaravelをどのように活用できるかについてのヒントをお持ちですか?どうすればこのループを高速化できますか?

私はあなたが、むしろちょうど各十年testtingよりも、パターンにこのような何かの日付を破ることができると思い
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

おそらく 'WhereIn'を使って、クエリを一度実行してから結果をループするだけです。 –

+0

私はそれを試してみましょう。ありがとう! – David

答えて

0

私は最も時間がかかる部分は、クエリを実行する必要がありますと信じています。 whereInを使用している場合は、クエリを1回だけ実行してから結果をループすることができます。私はそれをテストしていませんが、それはこのようなものでなければなりません:

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

私は、クエリの実行回数を減らすことは、ゆっくりと実行しているから、これを維持するための主要な機会になると思います。また、purchase_yearにインデックスを追加することは、まだそうしていない場合に役立つはずです。

年をグループ化するための多くのelseif条件の代わりに、数式を使用することができます。これは実際には少し遅くなるかもしれませんが、コードは繰り返しの回数が少なくなるでしょう。私はこの部分に対して行うことは、クエリ部分でできることと比べてマイクロ最適化になると考えています。私の提案:

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

私は同意します。ループが繰り返されるたびにインベントリテーブルを押すことはかなり醜いです。ありがとうございました - 私はこれを午前中に渦巻きにします。 – David

0

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' 
} 

はこれをテストしていませんが、私はそれが何をするだろうと思うがあなたが望むでしょう。

+0

これを次に試してみます。ご協力ありがとうございました! – David

関連する問題