首页 > 解决方案 > 如何加载没有相关对象的模型?

问题描述

我从存储库对象中获取模型对象列表,通常的代码如下:

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

现在,如果我调试对象,我会看到所有相关的复杂对象成员也已加载,它们的相关成员也已加载,依此类推。所以存储库提供了一个巨大的树,而我只需要没有深度的对象列表。复杂对象成员可能只是NULL. 因此,构建列表太慢且没有必要。

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

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

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

标签: typo3-7.6.xtypo3-extensions

解决方案


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

它是基于 extbase 的查询方法之一: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. 但是,嘿,这是一扇优化的大门。


推荐阅读