2013-03-12 57 views
4

我想知道是否有可能在一個查詢中使用流利的查詢生成器獲取多個字段的總和。總結在Laravel的多個字段

我目前有兩個表格:活動和與會者。參加者屬於事件並具有兩個字段:total_raised和total_hours。我想要做的是選擇所有事件和總金額/在該事件上花費的總小時數。現在,如果我只是使用SQL我會做一些事情來的效果:

SELECT Event.id, sum(Attendees.total_raised), sum(Attendees.total_hours) 
FROM Events JOIN Attendees ON Events.id = Attendees.event_id 
GROUP BY Event.id 

不過,我似乎無法找到一種方法,採取多種資金一次用流利的查詢生成器。有沒有辦法做我想用流利做什麼,或者我應該把它做成一個原始的SQL查詢?在simones答案

... 

->get(
    array(
    'events.id', 
    DB::raw('SUM(attendees.total_raised)'), 
    DB::raw('SUM(attendees.total_hours)') 
) 
); 

回答

4

您可以使用sum()即:

$q = DB::table('events') 
     ->join('attendees', 'events.id', '=', 'attendees.event_id') 
     ->sum('total_raised') 
     ->sum('total_hours'); 

如果不工作,你可以試試。你可以通過本質上運行兩個查詢來做到這一點

$query = DB::table('events')->join('attendees', 'events.id', '=', 'attendees.event_id'); 

$raised = $query->sum('total_raised'); 

$hours = $query->sum('total_hours'); 

這取決於具體情況。如果是在管理/ CMS方面,我會傾向於這個解決方案。如果它在前端,應該在單個查詢中完成,這將會更快。視內容而定,它可能會或可能不會有重大差異。

$result = DB::table('events')->join('attendees', 'events.id', '=', 'attendees.event_id') 
    ->get(array(
     DB::raw('SUM(attendees.total_raised) AS raised'), 
     DB::raw('SUM(attendees.total_hours) AS hours'), 
    )); 
+0

那是我最初的想法,但是當我這樣做,我得到第二和調用一個錯誤,指出「試圖調用總和(同樣的方式)在非成員對象上「。 – Jonathan 2013-03-12 18:37:35

+0

@Jonathan我已經更新了我的答案 – Simone 2013-03-12 18:47:20

+0

問題,我最終使用了這個解決方案,但是我不得不添加一個輕微的補遺,因爲我的數據庫前綴沒有包含在你的答案中。謝謝您的幫助。 – Jonathan 2013-03-12 20:07:06

0

大廈:

0

我在做我的項目同樣的事情,這裏是我找到的解決方案。我使用的是Laravel 5.2這裏的雄辯是雄辯的聲明。

這是我在我的項目中使用的聲明,請根據您的需要進行更改。

$result = self::select("*", DB::raw('SUM(auction_amount) as total_auction_amount') , DB::raw('SUM(commission_amount) as total_commission_amount'), 
      DB::raw('SUM(deposit_amount) as total_deposit_amount')) 
      ->groupBy('cp_user_id') 
      ->get() 
      ->toArray(); 

您可以使用您的查詢像

$result = self::select("*", DB::raw('SUM(auction_amount) as total_auction_amount') , DB::raw('SUM(Attendees.total_raised) as total_raised'), 
      DB::raw('SUM(Attendees.total_hours) as total_hours')) 
      ->with('Attendees') 
      ->groupBy('id') 
      ->get() 
      ->toArray();