2013-10-09 11 views
5

Mi piacerebbe restituire il punteggio medio per recensioni di giochi nel mio database. Sto costruendo il mio sito con laravel 4.Laravel 4 - Restituisce punteggio medio all'interno del modello?

TABELLA STRUTTURA:

GAMES (id, title, etc) 
REVIEWS (game_id, user_id, score, etc) 

CONTROLLER:

public function singleGame($id) 
{ 
    $game = Game::find($id); 

    if ($game) 
    { 
     return View::make('game')->with('game', $game); 
    } 
    else 
    { 
     return Redirect::to('/'); 
    } 
} 

Il mio pensiero è quello di tornare speriamo che il punteggio medio per un gioco attraverso $ gioco-> media dal mio punto di vista, ma non sono stato in grado di produrre il risultato desiderato con il mio modello di gioco.

GIOCO MODELLO:

public function scores() 
{ 
    return $this->hasMany('Review')->avg('score'); 
} 

ho provato un certo numero di metodi disponibili per il generatore di query, ma sto ancora imparando le corde quando si tratta di laravel/PHP, quindi sono un pò bloccato . Forse dovrei affrontare il problema in modo diverso?

Grazie.

+0

Stavo rispondendo su IRC .. rabbia. Ecco cosa ho detto. Aiuterò in IRC, non qui. http://paste.laravel.com/XuF – Robbo

+0

Haha. Mi dispiace, la mia connessione internet è stata interrotta. E sì, usiamo Bigpond qui in ufficio! – Scully

+0

Inoltre, cosa c'è di sbagliato in se (qualcosa) ritorno; altro ritorno? Come si fa? – Scully

risposta

18

Ecco due alternative per voi:

leggibilità (due query)

$game = Game::find(1); 
$game->average = $game->reviews()->avg('score'); 

Si noti che questo presuppone che si hanno avuto una funzione di recensioni per il vostro rapporto nel modello di gioco.

public function reviews() 
{ 
    return $this->belongsTo('Game'); 
} 

Questa alternativa utilizza la funzione avg aggregate. Le funzioni aggregate fornite dallo QueryBuilder restituiscono solo lo scalare aggregato.

Performance (una query)

Se si vuole veramente fare questo in una query. Ecco un'alternativa:

$game = Game::select('games.*', DB::raw('avg(reviews.score) AS average')) 
    ->join('reviews', 'reviews.game_id', '=', 'game.id') 
    ->groupBy('reviews.game_id') 
    ->where('game.id', '=', 1) 
    ->first(); 
+0

Fantastico. Userò il tuo primo suggerimento. È facile riordinare i miei giochi per punteggio medio? – Scully