2016-08-30 25 views
0

私は調査プラットフォームを構築しており、調査の平均回答率を取得する必要があります。 私が現在やっていることは、すべての質問を検索して、表示された時間と時間に分けて回答することです。 DBの平均を計算し、何千もの結果をループしないことによって、より効率的な/少ないリソース消費方法がありますか?あなたは生のSQLに行くことができますPHP - Laravel - Eloquentから直接平均を取得し、結果をループする必要はありません

$total_showed = 0; 
    $total_answered = 0; 

    $total_queries = Query::where('client_app_id','=', $app_id)->get(); 

    foreach ($total_queries as $app_query) { 
     $total_showed = $total_showed + $app_query->showed; 
     $total_answered = $total_answered + $app_query->answered; 
    } 
    if ($total_showed > 0) { 
     $total_arate = round(($total_answered/$total_showed) * 100, 1); 
    } else { 
     $total_arate = 0; 
    } 
+0

getの代わりにcountを使用すると、カウントが戻されます。 :) –

答えて

1

try $total_showed = $total_queries->sum('showed') $total_answered = $total_queries->sum('answered')

$以来total_queriesは、使用できるコレクションですそれはhttps://laravel.com/docs/5.3/collections#method-sum が、これは私が

+0

'' 'sum'''メソッドはDBに再度クエリを実行するのですか、PHPによって処理されますか? – BenNov

+0

いいえ、コレクションクラスに含まれていません...このクラスのドキュメントを確認してください – Sherif

1

確か:

代わりに:のような

$total_queries = Query::where('client_app_id','=', $app_id)->get(); 

使用何かをここで

は私の作業コードは、それが永遠にかかる今あります

$total_queries = Query::select(DB::raw('SUM(showed) as counter, SUM(answered) as answered')) 
       ->where('client_app_id','=', $app_id)->get(); 
0

)が(この集約関数の平均を試すと思うMRE効率的である参照 和方法です。このように

$price = DB::table('orders')->where('finalized', 1) 
       ->avg('price') 
関連する問題