Можно ли отсортировать Datalist / ComponentSet по вычисленному / виртуальному / агрегированному столбцу?
У меня есть DataList, содержащий события, имеющие StartDate и EndDate.
Теперь я хочу отсортировать список по продолжительности события (от самого короткого до самого длинного).
В SQL я бы сделал:
... ORDER BY DATEDIFF(EndDate, StartDate) ASC
Как это сделать с помощью Silverstripe ORM
$list = Event::get()->sort('????');
Дополнительный столбец, содержащий новую Field Duration и заполняющий это поле в onAfterWrite-hooks, не является предпочтительным.
Это возможно ?
Роберт
$list = Event::get()->sort(array('DATEDIFF("EndDate", "StartDate")' => 'ASC'));
DataList::sort
не выполняет экранирования, поэтому любое допустимое предложение ORDER BY будет работать нормально.
SELECT StartDate,EndDate,DATEDIFF(EndDate, StartDate) AS DiffDate FROM myTable ORDER BY DiffDate ASC
Вы можете рассчитать этот дифференциал в select, чтобы показать его и порядок, я использую «AS DiffDate», чтобы упростить
Вы можете использовать это так:
SELECT *, DATEDIFF(EndDate, StartDate) as duration FROM table WHERE conditional = 1 ORDER BY duration ASC