2013-08-19 11 views
6

szukam, aby uzyskać średnią wartość w wielu kolumnach na powiązanym modelu, mniej więcej tak:Jak uśredniać wiele kolumn za pomocą Eloquent?

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

Gdzie komunikacja i życzliwość są tablicą z nazwami kolumn. Jednak wygląda na to, że zagregowane funkcje obsługują tylko nazwy z jedną kolumną, więc robię to:

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

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

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

Co skutkuje wieloma zapytaniami. Jakieś sugestie dotyczące najlepszej praktyki tutaj?

Dzięki

Odpowiedz

9

Aby uniknąć wielokrotnych zapytań można użyć raw database expression ciągu Eloquent jak pokazano poniżej:

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

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

Ponieważ łączna nazwa funkcji avg jest rozpoznawany przez wszystkich obsługiwanych danych przez laravel, to będzie nie jest to wielka sprawa.

+0

Dzięki - działa uczta. –

+0

Świetnie, dzięki - mała literówka na DB: surowa, powinna być DB :: surowa - otucha – Leon

+0

Dzięki, zaktualizowałem swoją odpowiedź. –

Powiązane problemy