9

我想在我的数据库中返回游戏评论的平均分数。我正在使用 Laravel 4 构建我的网站。

表结构:

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

控制器:

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

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

我的想法是希望通过 $game->average 在我看来返回游戏的平均分数,但是我无法通过摆弄我的游戏模型来产生所需的结果。

游戏模型:

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

我已经尝试了许多查询生成器可用的方法,但是当涉及到 Laravel/PHP 时,我仍在学习绳索,所以我有点卡住了。也许我应该以不同的方式处理这个问题?

谢谢。

4

1 回答 1

25

这里有两种选择:

可读性(两个查询)

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

请注意,这假设您在游戏模型中为您的关系提供了评论功能。

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

这种替代方法是使用avg 聚合函数。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();
于 2013-10-09T10:06:52.970 回答