typo3-7.6.x - 如何加载没有相关对象的模型?
问题描述
我从存储库对象中获取模型对象列表,通常的代码如下:
...
$query = $this->createQuery();
$query->getQuerySettings()->setStoragePageIds($projectStoragePids);
...
$query->matching($query->logicalOr($constraints));
$result = $query->execute();
现在,如果我调试对象,我会看到所有相关的复杂对象成员也已加载,它们的相关成员也已加载,依此类推。所以存储库提供了一个巨大的树,而我只需要没有深度的对象列表。复杂对象成员可能只是NULL
. 因此,构建列表太慢且没有必要。
我知道@lazy
,但是如果我在模型中设置此属性(并清除缓存),它不会改变。
除了禁用深度加载相关对象之外,还有哪些选项@lazy
?什么自动导致 TYPO3 域处理程序加载或跳过相关对象?
在 C# 中,您可以选择.include()
. TYPO3呢?
解决方案
一件重要的事情是您可以使用$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
. 但是,嘿,这是一扇优化的大门。
推荐阅读
- java - 无法以编程方式隐藏弧形菜单中的 fab 按钮。尝试上传.hide(); 无法弄清楚如何隐藏fab按钮
- sql - 用于计算总数的 SQL 查询
- tensorflow2.0 - 加载 tensorflow2.0 模型时出现错误
- scala - Apache Spark 中窗口函数中的过滤器和条件
- optaplanner - Optaplanner:动态添加/删除约束
- holoviews - 将值添加到 hvplot 中的分组条形图
- amazon-web-services - 设置 AWS Cloudwatch 警报数据点时间跨度和将其关闭的操作
- nginx - 从 http 到 https 的重定向在 nginx 中不起作用
- excel - 使用 OLEDB 连接将 Access 数据库连接到 Excel
- linux - ceph-rgw 安装后服务自动停止