2015-12-18 104 views
1

我有什麼是希望快速的問題關於Laravel的收藏。根據某個特定ID進行分組,並且只符合特定條件的最佳方式是什麼?使用下面的會議表格示例,我正在嘗試爲每個company_id進行最近的會議。換句話說,我想,以減少下面只ID的數組:2,5,和8Laravel收集集團與最大值

id | company_id | date  | topic | attendees 
1 | 1   | 2015-06-30 | Intro | 5 
2 | 1   | 2015-09-30 | Update | 2 
3 | 1   | 2013-03-30 | Update | 4 
4 | 2   | 2014-03-30 | Intro | 3 
5 | 2   | 2015-01-15 | Update | 8 
6 | 3   | 2012-10-15 | Intro | 12 
7 | 3   | 2015-06-15 | Update | 5 
8 | 3   | 2015-09-15 | Update | 2 

回答

1

嘗試是這樣的:

$latest = DB::table('meetings as latest') 
    ->whereNotExists(function ($query) { 
     $query->select(DB::raw(1)) 
       ->from('meetings') 
       ->whereRaw('company_id = latest.company_id') 
       ->whereRaw('date > latest.date'); 
    }) 
    ->get(); 

的想法是隻把這些記錄如果相同公司的記錄不存在,那麼會議日期將晚。

+0

他爲什麼要用子查詢? –

+0

使用最大日期分組是另一種選擇,但您仍然需要獲取與該記錄相對應的其他字段。這就是爲什麼我提出這個建議,但有很多方法可以得到相同的結果。 – trincot

0

這是我通常如何處理這些情況。您按公司ID在子查詢中進行分組,並加入最大日期和公司ID匹配的地方。

$subQuery = "(SELECT 
       company_id, 
       MAX(DATE) AS `date` 
      FROM meetings 
      GROUP BY company_id) max_date"; 

$res = DB::table('meetings') 
    ->select('meetings.*') 
    ->join(DB::raw($subQuery), function($join) { 
     $join->on('max_date.company_id', '=', 'meetings.company_id')->on('max_date.date', '=', 'meetings.date'); 
    }) 
    ->get();