2015-12-18 3 views
1

У меня есть, на наш взгляд, быстрый вопрос относительно коллекций Laravel. Каков наилучший способ группировки по определенному идентификатору и принимать только записи, соответствующие определенным критериям? Используя приведенный ниже пример таблицы совещаний, я пытаюсь провести самую последнюю встречу для каждого company_id. Другими словами, я хотел бы, чтобы уменьшить массив ниже только ид: 2, 5 и 8.Laravel Collection group by с максимальным значением

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

Вот как я обычно справляюсь с этими ситуациями. Вы группируете идентификатор компании в подзапросе и присоединяетесь к максимальной дате и к совпадению идентификатора компании.

$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(); 
Смежные вопросы