SilverStripe:排序数据对象与有许多关系
在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
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();
?>