вложенный запрос коллекции laravel - PullRequest
0 голосов
/ 28 октября 2019

Я новичок в коллекции Laravel. я просто хочу сделать этот запрос с коллекцией

DB::select(SELECT id, user_id, created_at,latitude,longitude

FROM coordinates

WHERE created_at IN (

    SELECT MAX(created_at)

    FROM coordinates

    GROUP BY user_id));

в соответствии с документом https://laravel.com/docs/6.x/collections

это то, что я сделал, и он дает мне все данные $this->data['information'] = collect($response->json()['items']);

Редактировать:

просто мне нужно создать этот запрос (о котором я упоминал выше) с использованием Collection.

Это содержимое $response-> json () ['items']

"#items: array:17 [▼ 0 => array:9 [▼ "id" => 977777779 "platform_id" => "msaeed" "platform_type" => 1 "status" => 1 "longitude" => 1.1 "latitude" => 1.1 "created_by" => "NMF" "created_at" => "2019-10-27T21:00:00Z" "updated_at" => "2019-10-28T07:58:36Z""

любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Вот запрос.

$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? Эти данные не приходят из БД?

0 голосов
/ 28 октября 2019

Вы хотите собрать рекурсивный массив. К сожалению, у laravel нет этой функции:

вы можете написать его самостоятельно. если у вас есть файл помощников, вы можете написать этот метод:

function recursive_collect($array){
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $value = recursive_collect($value);
            $array[$key] = $value;
        }
    }

    return collect($array);
}

Или вы можете реализовать макрос в вашем AppServiceProvider:

\Illuminate\Support\Collection::macro('recursive', function () {
    return $this->map(function ($value) {
        if (is_array($value) || is_object($value)) {
            return collect($value)->recursive();
        }

        return $value;
    });
});

Надеюсь, это поможет вам

...