[英]what is the difference with these query classes in TYPO3?
我在我的扩展中使用 extbase,所以我有*Repository
类,我可以在其中执行简单的查询,例如:
public function getRecordsByCondition($config = [],$recordPages = null) {
$recordQuery = $this->createQuery();
$constraints = [];
if ($config['field1']) {
$constraints[] = $recordQuery->equals('field1',$config['field1']));
}
if ($config['field2']) {
$constraints[] = $recordQuery->equals('field2',$config['field2']));
}
if ($config['field3']) {
$constraints[] = $recordQuery->equals('field3',$config['field3']));
}
if (count($constraints)) {
if ($recordPages) {
$constraints[] = $recordQuery->in('pid',$recordPages);
$recordQuery->getQuerySettings()->setRespectStoragePage(false);
}
$recordQuery->matching($recordQuery->logicalAnd($constraints));
} else {
return false;
}
return $recordQuery->execute();
}
这将尊重enableFields
和其他通常条件。
另一方面,可以选择以这种方式进行操作:
public function getrecords2($config,$recordPages) {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_myext_domain_model_records');
$rawquery = $queryBuilder
->select('*')
->from('tx_myext_domain_model_records')
->where(
$queryBuilder->expr()->eq('field1',$config['field1']),
$queryBuilder->expr()->eq('field2',$config['field2']),
$queryBuilder->expr()->eq('field3',$config['field3']),
$queryBuilder->expr()->in('pid', $recordPages),
$queryBuilder->expr()->eq('deleted',0),
$queryBuilder->expr()->eq('hidden',0)
// starttime, endtime, language, workspace, ....
);
return $rawquery->execute()->fetchAll();
}
我需要自己关心enablefields
但有更多选项来指定查询。
在第一个视图中,您可以看到还有其他方法( eq
与equals
)并且这些查询没有关系。 但两者都在同一张桌子上工作。
现在我需要将我的所有工作从第一个变体更改为第二个变体,因为我需要一个查询并join
到另一个表,而第一个变体无法完成(据我所知)。
我错过了什么还是第一个变体需要一些改进?
好吧,我不确定到底有什么区别,但让我尝试根据我的知识简要地表达一些事情:D
两个查询之间的主要区别是Individual database queries
(通常我称之为 Extbase 查询,我不确定我是否正确!)另一个是Doctrine DBAL Queries
在这里,根据现代方法扩展使用域建模。 So, TYPO3 already enables a secure connection for model
(Typically database table) and you can use relational table connection with Extbase function (Select, operational, join etc..) provided by TYPO3 core.
在这里,您使用ConnectionPool
class 为数据库表手动启用连接。 此外,您可以根据需要建立关系(或加入您可以说。)。
但是,如果hidden
delete
等,您可以使用restriction
来小心。
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_myext_domain_model_records');
$queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
$queryBuilder->getRestrictions()->add(GeneralUtility::makeInstance(HiddenRestriction::class));
$rawquery = $queryBuilder
->select('*')
->from('tx_myext_domain_model_records')
->where(
$queryBuilder->expr()->eq('field1',$config['field1']),
$queryBuilder->expr()->eq('field2',$config['field2']),
$queryBuilder->expr()->eq('field3',$config['field3']),
$queryBuilder->expr()->in('pid', $recordPages)
// starttime, endtime, language, workspace, ....
);
我知道这不是一个充分且 100% 正确的答案。 欢迎大家指正:)
我需要自己关心 enablefields 的地方
这不是真的。 默认情况下, Restrictions
处于活动状态,您可以使用简短命令启用或禁用每个Restriction
。
我使用这两种方法,但我只在 Extbase 扩展上使用第一种,在所有其他扩展上使用第二种。 (是的,存在没有 Extbase 的扩展)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.