sortBy(‘time’) выдает ошибку: time() ожидает ровно 0 параметров, 2 заданы в Laravel 8

#laravel #collections

#laravel #Коллекции

Вопрос:

У меня есть набор мер

 $m = new Measure([
                    'time' => $measure['timestamp'],
                    'operation_id' => $measure['op_id'],
                    'meter_id' => $prm,
                    'conso_prod' => $measure['conso_prod'],
                    'delta' => $measure['delta'],
                    'redistributed' => $measure['redistribute'],
                ]
 

Measure таблица представляет собой гипертаблицу postgres(расширение TimescaleDB)

time это временная метка без часового пояса

Когда я хочу отсортировать его, я могу сделать это с помощью:

 $myCollection->sortBy(['operation_id', 'meter_id', 'conso_prod']);
 

Но я также хочу отсортировать его по метке времени asc.

Теперь, если я сделаю:

 $myCollection->sortBy(['operation_id', 'meter_id', 'conso_prod', 'time']);
 

Я получаю сообщение об ошибке:

 time() expects exactly 0 parameters, 2 given
 

Почему это происходит?

Ответ №1:

Поскольку вы говорите, что ваш time ключ массива уже является меткой времени, поэтому я в основном проанализировал его до экземпляра Carbon.

 $myCollection->sortBy(function ($obj, $key) {
    return Carbon::parse($obj['time']);
});
 

Попробуйте использовать его отдельно от массива следующим образом,

 $myCollection->sortBy(['operation_id', 'meter_id', 'conso_prod'])->sortBy(function ($obj, $key) {
    return Carbon::parse($obj['time']);
});
 

Комментарии:

1. Ну, time — это временная метка в Postgres, но значение $measure[‘timestamp’] представляет собой строку в формате RFC3339 : 2020-10-01T00:00:00Z

2. ooopps, нет, это не работает. У меня больше нет ошибки, но теперь она отсортирована по времени, а не по [‘operation_id’, ‘meter_id’, ‘conso_prod’], и мне также нужно повторно применить -> values() к результату

3. Я сгруппирую его по -> groupBy([‘operation_id’, ‘meter_id’, ‘conso_prod’]), а затем отсортирую по времени, и это должно сработать!

4. Я никогда раньше не пытался сортировать по 4 вещам (максимум 1), поэтому, я думаю, вам нужно попробовать, тогда вы можете опубликовать здесь, если это сработало или нет