Silverstripe 排序DataList::使用ID数组获取

Silverstripe 排序DataList::使用ID数组获取,silverstripe,Silverstripe,我正在使用一个包含一些ID的数组,使用where子句执行DataList::get() $result = DataList::get('MyObject')->where('ID IN(' .implode(',',$idArr). ')'); 我的数组看起来像 array 0 => string '1' 1 => string '12' 2 => string '2' 3 => string '11' 我希望DataList:get()的结果

我正在使用一个包含一些ID的数组,使用where子句执行DataList::get()

$result = DataList::get('MyObject')->where('ID IN(' .implode(',',$idArr). ')');
我的数组看起来像

array
  0 => string '1'
  1 => string '12'
  2 => string '2'
  3 => string '11'
我希望DataList:get()的结果按照$idArr的相同顺序进行排序/排序。我试过了

$masteries = Mastery::get()->where('ID IN(' .implode(',',$idArr). ')')->sort('ID', implode(',',$idArr));
但那没用。有没有一种方法可以使用DataList执行此操作,或者我必须执行自定义查询?

您是否尝试过:

$masteries = Mastery::get()
    ->where('ID IN(' . implode(',',$idArr) . ')')
    ->sort('field(ID,' . implode(',',$idArr) . ') ASC');

为完整性起见,应注意OP询问了一种使用
DataList
执行此操作的方法,因此ORM编写此查询的方式(包括标准排序行为)为:

$masteries = Mastery::get()
    ->filter(array('ID' => $idArr))
    ->sort('ID', 'ASC'); // See the docblock for DataList::sort()

好极了。另一方面,“field”是mysql的东西,因此如果您正在为这段代码编写单元测试,并且依赖sqlite3作为数据库的适配器,那么这个查询将失败得很惨。这是不安全的,因为它使用的where子句(和sort)假设数据是干净的。silverstripe ORM允许您说->filter('ID',$idArr),这更简洁,但也会过滤$idArr。这更好,因为它是安全的,但是在通过一个过滤器时不需要数组value@Barry当然可以在我的辩护中,我认为我将使用多个过滤器参数,但删除了它并保留了数组:-)