2015-02-10 67 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語句計數()只具有審查規定的額定值。

當然查詢結果應該使用緩存:: 記住方法存儲在緩存中。