Laravel Collection以最大价值组合

时间:2015-12-18 20:13:56

标签: php laravel

我对Laravel的藏品有一个快速的问题。按特定ID分组的最佳方法是什么,只能使符合某个条件的条目?使用下面的会议表示例,我正在尝试为每个company_id进行最近的会议。换句话说,我想将下面的数组减少到只有id:2,5和8。

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

2 个答案:

答案 0 :(得分: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();

我们的想法是只将那些记录存放在同一家公司的记录中,而该公司的会议日期较晚。

答案 1 :(得分: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();