Выбирает самые последние date
для каждого user_id
:
$sub = Visit::select('user_id', DB::raw('max("date") "date"'))->groupBy('user_id');
$sql = '(' . $sub->toSql() . ') as "sub"';
$visits = Visit::join(DB::raw($sql), function($join) {
$join->on('visits.user_id', 'sub.user_id')
->on('visits.date', 'sub.date');
})->orderBy('visits.date', 'desc')->get(['visits.date', 'visits.user_id']);
Если для комбинации user_id
и date
имеется несколько посещений, запрос возвращает их все.Удаление дубликатов возможно, но усложняет запрос.
После этого их легче удалить:
$visits = $visits->unique('user_id');