2015-02-10 32 views
0

如何使用上相关表汇总雄辩laravel 4.获取与集合对象相关的表

SQL与结构法提取物:

TABLE companies 
id PRIMARY KEY 
title TEXT 
... 

TABLE ratings 
id PRIMATRY KEY 
company_id FK KEY 
some_rating_1 INTEGER -- for example rating for delivery 
some_rating_2 INTEGER -- for example rating for customer service 
some_rating_2 INTEGER -- for example rating for price 
... 

我想公司的收集与汇总评级。

我试过类似下面的东西,但我不能附加AVG GET关闭。

Company::with(['ratings' => function($query) { 
     $query->avg('some_rating_1'); 
     $query->avg('some_rating_2'); 
     $query->avg('some_rating_3'); 
     $query->get(['company_id', 'some_rating_1']); 
    }])->get(); 

任何人都知道我可以通过aggergation获取评级公司吗?

回答

0

我想通了,我自己,这里的解决方案:

Company::with(['ratings' => function($query) { 
     $query->select(
      'company_id', 
      DB::raw('round(avg(rating_overall)::numeric, 2) as rating_overall'), 
      DB::raw('round(avg(some_rating_1)::numeric, 2) as rating_fast'), 
      DB::raw('round(avg(some_rating_2)::numeric, 2) as rating_quality'), 
      DB::raw('round(avg(some_rating_3)::numeric, 2) as rating_service'), 
      DB::raw('count(company_id) as rating_amount'), 
      DB::raw('sum(CASE WHEN review IS NOT NULL THEN 1 else 0 END) as review_amount') 
     )->groupBy('detective_id'); 

子查询中的第一个属性“COMPANY_ID” FK是必要 - 我不知道为什么,但没有它laravel返回空集收视[ ]。这是解决这个问题最令我困惑的事情。

在下一个属性中,我们应该使用DB :: raw查询而不是Eloquent avg()方法。

在该溶液中的附加特征是在荷兰国际集团的PostgreSQL数轮”应当从浮子由总和来cnoverted到数字第一和CASE语句计数()只具有审查规定的额定值。

当然查询结果应该使用缓存:: 记住方法存储在缓存中。