如何在没有相关对象的情况下加载模型?

时间:2019-01-07 15:28:19

标签: typo3-7.6.x typo3-extensions

我从存储库对象中获取模型对象的列表,并使用以下常规代码:

...
$query = $this->createQuery();
$query->getQuerySettings()->setStoragePageIds($projectStoragePids);
...
$query->matching($query->logicalOr($constraints));
$result = $query->execute();

现在,如果我调试对象,则会看到所有相关的复杂对象成员也已加载,并且它们的相关对象也已加载,依此类推。因此,存储库正在交付一棵巨大的树,而我只需要没有深度的对象列表。复杂对象成员可能只是NULL。因此,建立列表太慢且不必要。

我知道@lazy,但是如果我在模型中设置此属性(并清除缓存),它不会改变。

除了@lazy之外,还有哪些选项可以禁止深度加载相关对象?哪种自动机制导致TYPO3域处理程序加载或跳过相关对象?

在C#中,您可以按.include()进行选择。 TYPO3呢?

2 个答案:

答案 0 :(得分:0)

重要的一点是您可以使用$query->statement($sql, $params)

这是基于ext的查询方法之一: http://lbrmedia.net/codebase/Eintrag/extbase-query-methods/

如果使用此选项,则可以编写select语句,该语句仅包含选择的字段。 T3模型对象构建器将采用您选择的行和字段,并根据可用信息创建模型对象。

例如,假设我们先写:

...
$query = $this->createQuery();  
$result = $query->execute();
return $result;

像这样,您将获得一个对象列表,其中每个对象成员字段也使用完整的对象初始化。

但是如果我们编写示例:

$query = $this->createQuery();
$query->statement('select uid from tx_my_table'); // <<<<<<<<  
$result = $query->execute();
return $result;

然后,您仍然会获得对象列表,但唯一具有真实值的成员字段是uid 。这样,您也可以选择一个指向某些m:m关系的字段。它将被处理。

这可能会带来巨大的速度提升。

需要注意的是,T3 extbase存储库以某种方式稍微在您的纯sql和一些内部规范之间创建了混合。我认为搜索“ TYPO3 convertQueryToDoctrineQueryBuilder”可能会发现更多提示。此外,您必须重写通常由$querySettings给出的自己的查询限制。但是,嘿,这是优化的门户。

答案 1 :(得分:0)

尝试$query->execute(1);。这是rawResult标志,它将原始数据库行作为数组而不是对象返回。与其他对象的关系也无法解析。