Php 按计算/聚合列对数据列表进行排序

Php 按计算/聚合列对数据列表进行排序,php,sorting,silverstripe,datalist,Php,Sorting,Silverstripe,Datalist,是否可以按计算/虚拟/聚合列对数据列表/组件集进行排序 我有一个数据列表,其中包含具有StartDate和EndDate的事件。 现在我想按事件的持续时间(从最短到最长)对列表进行排序 在SQL中,我将执行以下操作: ... ORDER BY DATEDIFF(EndDate, StartDate) ASC 如何使用silverstripe ORM实现这一点 $list = Event::get()->sort('????'); 不建议使用包含新字段Duration并在onAfterW

是否可以按计算/虚拟/聚合列对数据列表/组件集进行排序

我有一个数据列表,其中包含具有StartDate和EndDate的事件。 现在我想按事件的持续时间(从最短到最长)对列表进行排序

在SQL中,我将执行以下操作:

... ORDER BY DATEDIFF(EndDate, StartDate) ASC
如何使用silverstripe ORM实现这一点

$list = Event::get()->sort('????');
不建议使用包含新字段Duration并在onAfterWrite钩子中填充此字段的附加列

这可能吗


罗伯特

你可以这样使用它:

SELECT *, DATEDIFF(EndDate, StartDate) as duration FROM table WHERE conditional = 1 ORDER BY duration ASC
你可以在select中计算这个差异来显示它和顺序,我使用“AS DiffDate”来简化

$list = Event::get()->sort(array('DATEDIFF("EndDate", "StartDate")' => 'ASC'));

DataList::sort
不会进行任何转义,因此任何有效的ORDER BY子句都可以正常工作。

sry表示不清楚。排序应由silverstripe ORM处理。。。不是典型的sqlsry,因为它不清晰。排序应由silverstripe ORM处理。。。不是经典的sql
$list = Event::get()->sort(array('DATEDIFF("EndDate", "StartDate")' => 'ASC'));