【问题标题】:Sort DataList by calcualated/aggregated column按计算/聚合列对 DataList 进行排序
【发布时间】:2014-11-14 08:19:16
【问题描述】:

是否可以按计算/虚拟/聚合列对 Datalist/ComponentSet 进行排序?

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

在 SQL 中我会这样做:

... ORDER BY DATEDIFF(EndDate, StartDate) ASC

如何用 silverstripe ORM 做到这一点

$list = Event::get()->sort('????');

包含新字段持续时间并在 onAfterWrite-hooks 中填充此字段的附加列不是首选。

这可能吗?

罗伯特

【问题讨论】:

    标签: php sorting silverstripe datalist


    【解决方案1】:
    $list = Event::get()->sort(array('DATEDIFF("EndDate", "StartDate")' => 'ASC'));
    

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

    【讨论】:

      【解决方案2】:
      SELECT StartDate,EndDate,DATEDIFF(EndDate, StartDate) AS DiffDate FROM myTable ORDER BY DiffDate ASC
      

      你可以在选择中计算这个差异来显示它和排序,我使用'AS DiffDate'来简化

      【讨论】:

      • 抱歉不清楚。排序应该由 silverstripe ORM 处理......不是经典的 sql
      【解决方案3】:

      你可以这样使用它:

      SELECT *, DATEDIFF(EndDate, StartDate) as duration FROM table WHERE conditional = 1 ORDER BY duration ASC
      

      【讨论】:

      • 抱歉不清楚。排序应该由 silverstripe ORM 处理......不是经典的 sql
      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多