【问题标题】:Silverstripe changing the class of a DataListSilverstripe 更改 DataList 的类
【发布时间】:2015-03-18 03:18:01
【问题描述】:

我有一个 Holder 类,它返回 BaseClass 类型的 DataList。这些对象实际上是 SearchClass 对象。如何转换 DataList 以便可以按 SearchClass 字段进行过滤。

class SearchClass extends BaseClass(){
    public static $db = array('myField' => 'Int');
}

abstract class Holder{
    abstract protected function myList();
}

$holder = new ConcreteHolder();
$holder->myList()->filter('myField',1);

【问题讨论】:

    标签: orm silverstripe


    【解决方案1】:

    最简单的方法是:

    class Holder extends DataObject {
        public function myList(){
            return SearchClass::get()->filter('baseField', 'aValue');
        }
    }
    

    【讨论】:

      【解决方案2】:

      过了一会儿,我想出了解决方案。

      public function convert($list){
          $ids = $list->filter('ClassName', 'SearchClass')->getIDList();
          return SearchClass::get->byIDs($ids);
      }
      

      【讨论】:

      • return $list->filter('ClassName', 'SearchClass'); // 就足够了
      • 数据列表适用于特定的类数据库表。所以 Datalist 只知道 BaseClass 属性。
      • DataList 也包括所有子类。
      • 如果您运行Debug::dump(SearchClass::get()->filter('myField',1)->sql());,您会看到它会为表执行 JOIN。您现在正在执行不必要的查询。除非您从一开始就以一种奇怪的方式处理数据对象,因为您所做的查询是@micmania1 答案是您应该选择的。
      • 我也不确定 $holder = new ConcreteHolder(); 的用途少量。您可以使用 ModelAdmin 管理数据对象,然后直接使用 SearchClass::get()->filter('baseField', 'aValue') 过滤数据对象,而不是通过新的 ConcreteHolder(); 获取它们。可能这是一个原因,但只是指出:)
      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多