#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), поэтому, я думаю, вам нужно попробовать, тогда вы можете опубликовать здесь, если это сработало или нет