2013-10-09 5 views
5

내 데이터베이스에서 게임 리뷰의 평균 점수를 반환하고 싶습니다.Laravel 4 - 모델 내 평균 점수 반환?

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('/'); 
    } 
} 

내 생각은 희망 $ game-을 통해 게임에 대한 평균 점수를 반환하는 것입니다> 평균 나는 Laravel 4

테이블 구조 내 사이트를 구축하고 내 견해로는,하지만 나는 내 게임 모델을 만지작 거리며 원하는 결과를 낼 수 없었다.

게임 모델 :

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

나는 쿼리 빌더 가능한 방법의 숫자를 시도했다, 그러나 Laravel/PHP에 관해서 나는 아직도 밧줄을 배우고, 그래서 좀 붙어 . 아마도 내가 다르게 문제에 접근해야합니까?

감사합니다. 이것은 당신이 당신의 게임 모델에서의 관계에 대한 리뷰 기능을 가지고 있다고 가정

가독성 (두 개의 쿼리)

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

참고 :

+0

나는 IRC .. 분노에 답하고있었습니다. 여기 내가 말한 것이있다. IRC에서 도와 드리겠습니다. http://paste.laravel.com/XuF – Robbo

+0

하하. 죄송합니다. 제 인터넷 연결이 끊어졌습니다. 그리고 네, 여기 빅 그래프를 사무실에서 사용합니다! – Scully

+0

또한 (무엇인가) 돌아 오는 경우에 무엇이 잘못 되었습니까; 그렇지 않으면? 어떻게 할 수 있니? – Scully

답변

18

여기 당신을 위해 두 가지 대안입니다.

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

이 대체 방법은 avg aggregate 기능을 사용하고 있습니다. QueryBuilder에서 제공하는 집계 함수는 집계 스칼라 만 반환합니다.

성능 (하나 개의 쿼리)

당신이 정말로 하나 개의 쿼리에서이 작업을 수행하려면 . 여기 하나의 대안이 있습니다 :

$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

환상적입니다. 나는 너의 첫번째 제안을 사용할 것이다. 평균 점수로 게임을 재정렬하는 것이 쉬운가요? – Scully