与 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,但有更多选项来指定查询。

在第一个视图中,您可以看到还有其他方法(eqvs.equals)和这些执行查询没有任何关系。但两者都在同一张桌子上工作。

现在我需要将所有工作从第一个变体更改为第二个变体,因为我需要一个查询,join到另一个表,而第一个变体无法完成(据我所知).
我错过了什么还是第一个变体需要一些增强?

好吧,我不确定确切的区别,但让我尝试根据我的知识简要表达事物:D

两个查询之间的主要区别是Individual database queries(通常我称之为Extbase查询,我不确定我是否正确!),另一个是Doctrine DBAL Queries

1. 单个数据库查询

在这里,根据现代方法扩展使用域建模。因此,TYPO3 已经启用了model(通常是数据库表)的安全连接,您可以将关系表连接与 TYPO3 核心提供的 Extbase 功能(选择、操作、连接等)一起使用。

更多: https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/6-Persistence/3-implement-individual-database-queries.html

2. 学说 DBAL

在这里,您可以使用ConnectionPool类手动为数据库表启用连接。此外,您可以根据需要建立关系(或加入!

更多信息: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/Index.html

但是,您可以使用restriction来照顾hiddendelete等。

$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, ....
);

请参阅:https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/RestrictionBuilder/Index.html

我知道这不是一个足够和100%正确的答案。欢迎大家指正我:)

我需要自己关心启用字段的地方

那不是真的。默认情况下,有Restrictions处于活动状态,您可以使用简短的命令启用或禁用每个Restriction

我使用这两种方法,但我仅在 Extbase 扩展上使用第一种方法,在所有其他扩展上使用第二种方法。(是的,存在没有扩展基础的扩展)

最新更新