7

次のような、関連するモデルの複数の列の平均値を取得しようとしています。

$this->reviews()->avg('communication', 'friendliness')

コミュニケーションと親しみやすさは列名の配列です。ただし、集計関数は単一の列名のみをサポートしているように見えるので、これを行っています:

$attributes = array('communication', 'friendliness');
$score = array();

foreach ($attributes as $attribute)
{
    $score[] = $this->reviews()->avg($attribute);
}

return round(array_sum($score) / sizeof($attributes), 1);

その結果、複数のクエリが発生します。ここでベストプラクティスの提案はありますか?

ありがとう

4

1 に答える 1

11

複数のクエリを回避するには、以下に示すように、 Eloquent内で生のデータベース式を使用できます。

$averages = $this->reviews()
    ->select(DB::raw('avg(communication) c, avg(friendliness) f'))
    ->first();

echo $averages->c;
echo $averages->f;

集計関数名avgは Laravel がサポートするすべてのデータベースで認識されるため、これは大きな問題にはなりません。

于 2013-08-19T13:40:48.957 に答える