【问题标题】:SilverStripe: Sorting DataObject with has_many relationSilverStripe:使用 has_many 关系对 DataObject 进行排序
【发布时间】:2014-03-18 15:16:39
【问题描述】:

在 SilverStripe 中,我有一个事件数据对象

class Event extends DataObject {
    private static $db = array(
        'Name'          => 'Text'
    );

    private static $has_many = array(
        'EventDates'    => 'EventDate'

有很多活动日期:

class EventDate extends DataObject {
    private static $db = array(
        'Day'          => 'Date',
        'StartTime'     => 'Varchar',
        'EndTime'       => 'Varchar'    
    );

现在,如果我查询页面上的所有事件,例如

Event::get()

我希望它们按最早日期排序。

哪种方式最适合实现这一目标?

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    您可以使用默认排序规则在 DataObject 类上定义静态属性:

    <?php
    
      class EventDate extends DataObject {
    
        …
        // This also effects the default sorting of `has_many` related Events.
        private static $default_sort = "\"Day\" ASC";
    
      }
    
    ?>
    

    现在

    <?php
    
      // first we pick a Event object, for instance by a (given) $id
      $event = Event::get()->byId($id);
      // because the default sort ist Day the attached `EventDate` will now be sorted by `Day` if you don't specify otherwise
      $events = $event->EventDates();
      // will return the earliest Event (of course you don't filter events here which are in the past).
      $firstEvent = $events->First();
    
      // if you then want to sort differently at some place, you can call ->sort() on the list:
      $event = Event::get()->byId($id);
      $events = $event->EventDates()->sort('LastEdited', 'DESC');
      $lastEditedEvent = $events->First();
    
    ?>
    

    【讨论】:

    • 但是 Event 类没有 Day 属性!?当我插入 default_sort 'Day' 时,我得到“'field list' 中的未知列 'Date'”
    • 是的,我不小心混淆了EventEventDate(已更正)。无论如何,方法保持不变;您在要按特定规则排序的 DataObject 模型上定义 $default_sort
    • 所以我知道 default_sort=Day 对 EventDates 进行排序。但我想按事件的开始日期对事件进行排序,这是每个事件可以拥有的许多 EventDates 中最早的日期。我需要复杂的连接查询,还是在 SilverStripe 中有更好、更符合标准的方法?
    • 是的,这会导致使用 orm 不完全支持的聚合函数。我建议看一下doc.silverstripe.org/framework/en/reference/sqlquery,了解如何在 SilverStripe 中处理自定义/原始 sql 查询。
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多