Scu*_*lly 8 php sql laravel laravel-4
我想在我的数据库中返回游戏评论的平均分数.我正在用Laravel 4构建我的网站.
表结构:
GAMES (id, title, etc)
REVIEWS (game_id, user_id, score, etc)
Run Code Online (Sandbox Code Playgroud)
控制器:
public function singleGame($id)
{
$game = Game::find($id);
if ($game)
{
return View::make('game')->with('game', $game);
}
else
{
return Redirect::to('/');
}
}
Run Code Online (Sandbox Code Playgroud)
我的想法是希望在我看来通过$ game-> average返回游戏的平均分数,但是我无法通过摆弄我的游戏模型来产生预期的结果.
游戏模型:
public function scores()
{
return $this->hasMany('Review')->avg('score');
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一些查询构建器可用的方法,但是当我谈到Laravel/PHP时,我仍在学习绳索,所以我有点卡住了.也许我应该以不同的方式处理这个问题?
谢谢.
Mat*_*röm 23
以下是两种替代方案:
可读性(两个查询)
$game = Game::find(1);
$game->average = $game->reviews()->avg('score');
Run Code Online (Sandbox Code Playgroud)
请注意,这假设您的游戏模型中的关系具有评论功能.
public function reviews()
{
return $this->belongsTo('Game');
}
Run Code Online (Sandbox Code Playgroud)
这种替代方案是使用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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13464 次 |
| 最近记录: |