Вот запрос.
$data = collect($response->json()['items']);
$data = $data->whereIn('created_at', $data->sortByDesc('created_at')
->groupBy('user_id')
->pluck('0.created_at'))
->onlyKeys(['id', 'user_id', 'created_at', 'latitude', 'longitude']);
Эквивалент для подзапроса:
SELECT MAX(created_at)
FROM coordinates
GROUP BY user_id
равен
$data->sortByDesc('created_at') // we use sortByDesc to produce the same result as `MAX`.
->groupBy('user_id')
->pluck('0.created_at') // then to get the max value, just get the first array after grouping.
Чтобы выполнить оператор select
,нам нужно создать небольшой макрос, я назвал его onlyKeys
:
use Illuminate\Support\Arr;
Collection::macro('onlyKeys', function ($keys) {
return $this->map(function ($value) use ($keys) {
$tmpValue = (array) $value;
if (is_array($tmpValue)) {
$value = Arr::only($tmpValue, $keys);
}
return $value;
});
});
Вы можете зарегистрировать макрос в вашем AppServiceProvider.php .
PS. Зачем вам нужно запрашивать с помощью Collection? Эти данные не приходят из БД?