首页 > 解决方案 > SilverStripe 一次性查询所有 DataObject 表

问题描述

我正在使用 SilverStripe CMS 开发一个网站。我在查询 DataObjects 时遇到了一点问题。我正在尝试一次性获取所有 DataObjects 以优化性能:

DataObject::get();

当调用它时,我收到以下错误:

[Emergency] Uncaught InvalidArgumentException: Call ::get() instead of DataObject::get()

如果我可以查询它,我想做这样的进一步操作:

DataObject::get()->filterAny([ 'ClassName' => 'ClassName' ]);

我还尝试使用以下查询:

$sqlQuery = new SQLQuery();
$sqlQuery->setFrom('Player');

但问题是我不知道全局/父表名称 DataObject 的名称是什么。

是否可以在 SilverStripe 中做我想做的事情,如果可以,怎么做?

标签: phpsilverstripesilverstripe-4

解决方案


我们不能一次调用DataObject::get()全部检索DataObjectsDataObject本身没有数据库表,因此无法查询。

我们无法在一次查询中获取所有自定义数据对象。

我们可以通过调用在一个查询中获取所有页面Sitetree::get()

如果我们希望能够DataObjects在一个查询中获取所有我们自己的自定义,我们需要首先创建一个BaseObject并拥有我们所有的自定义DataObjects扩展BaseObject

基础对象

use SilverStripe\ORM\DataObject;

class BaseObject extends DataObject
{
}

其他自定义类

class ExampleObject extends BaseObject
{
}

class AnotherExampleObject extends BaseObject
{
}

然后我们可以调用BaseObject::get()来获取我们所有的自定义对象并调用SiteTree::get()来获取我们所有的页面。

请注意,这仍然不会DataObjects在任何已安装的模块中得到任何定义,包括 SilverStripe 核心。这包括Member,FileSiteConfig。这些总是需要用他们自己的get()请求来检索。


推荐阅读