QueryBuilder:数据透视表

时间:2016-01-07 18:14:23

标签: php mysql laravel laravel-5 eloquent

我是Laravel&的新手。雄辩。我的数据库上有用户,产品和投票表。用户可以对产品进行投票(0到5),因此它是“多对多”关系,投票表就像一个支点:

  • 用户:ID,姓名,电子邮件,密码
  • 产品:id,名称,型号,品牌
  • 投票:user_id,product_id,投票

我像这样映射了这个架构:

// User model:
public function product_votes()
{
    return $this->belongsToMany('App\Product', 'votes')->withPivot('vote');
}

// Product model:
public function product_votes()
{
    return $this->belongsToMany('App\User', 'votes')->withPivot('vote');
}

所以John可以在产品X上投票5,在产品Y上投票0.Bob可以在产品X上投票2,在产品Y上投票3,依此类推......

我正在尝试使用每个产品的总票数来查询所有产品。类似的东西:

SELECT p.*, (SUM(v.vote) / COUNT(*)) as votes FROM products p INNER JOIN votes v on v.product_id = p.id GROUP BY p.id

如何使用QueryBuilder执行此操作?我的映射是对的吗?

1 个答案:

答案 0 :(得分:2)

以下将解决这个问题:

Product::select('products.*', DB::raw('SUM(vote)/COUNT(*) as votes'))
->join('votes', 'votes.product_id', '=', 'products.id')
->groupBy('products.id')
->get();

您可以通过调用 toSql()而不是 get()来查看将要运行的查询。