SilverStripe:排序数据对象与有许多关系

SilverStripe:排序数据对象与有许多关系,silverstripe,Silverstripe,在SilverStripe中,我有一个事件数据对象 class Event extends DataObject { private static $db = array( 'Name' => 'Text' ); private static $has_many = array( 'EventDates' => 'EventDate' 有许多活动日期: class EventDate extends

在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()
我要他们按最早的日期分类


实现这一目标的最佳方式是什么

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

<?php

  class EventDate extends DataObject {

    …
    // This also effects the default sorting of `has_many` related Events.
    private static $default_sort = "\"Day\" ASC";

  }

?>

现在


但是事件类没有Day属性!?当我插入默认的_sort'Day'时,我在'field list'中得到了'Unknown column'Date'“Yes,我意外地混淆了
事件
事件日期
(已更正)。无论如何,方法保持不变;您在要按特定规则排序的数据对象模型上定义了一个
$default\u sort
,因此默认的\u sort=Day对事件日期进行排序,我知道。但我想按事件的开始日期对事件进行排序,这是每个事件可以拥有的众多事件日期中最早的日期。我是否需要一个复杂的连接查询,或者在SilverStripe中是否有更好、更符合标准的方法?是的,这将导致使用orm不完全支持的聚合函数。我建议您看看如何在SilverStripe中处理定制/原始sql查询。
<?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();

?>