TYPO3 中的这些查询 类 有什么区别?
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
)和这些查询没有关系。但是两者都在相同的 table.
上工作
现在我需要将所有工作从第一个变体更改为第二个变体,因为我需要一个带有 join
的查询到另一个 table,这是无法完成的第一个变体(据我所知)。
我是否遗漏了什么或者第一个变体是否需要一些改进?
好吧,我不确定到底有什么区别,但让我尝试根据我的知识简要地表达一下:D
两个查询之间的主要区别是 Individual database queries
(通常我称之为 Extbase 查询,我不确定我是否正确!)另一个是 Doctrine DBAL Queries
1。个人数据库查询
在这里,根据现代方法扩展使用领域建模。因此,TYPO3 已经为 model
(通常是数据库 table)启用了安全连接,您可以将关系 table 连接与 Extbase 函数(Select、操作、连接等)结合使用。 ) 由TYPO3核心提供。
2。学说 DBAL
在这里,您使用 ConnectionPool
class 为数据库 table 手动启用连接。此外,您更有可能根据自己的需要建立关系(或加入您可以说!)。
更多:https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/Index.html
但是,如果 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% 正确的答案。欢迎大家指正:)
where I need to care about enablefields by myself
事实并非如此。默认情况下有 Restrictions
个活动,您可以使用简短命令启用或禁用每个 Restriction
。
我使用这两种方法,但我只在 Extbase 扩展上使用第一种,在所有其他扩展上使用第二种。 (是的,存在没有 Extbase 的扩展)
我在我的扩展中使用了 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
)和这些查询没有关系。但是两者都在相同的 table.
现在我需要将所有工作从第一个变体更改为第二个变体,因为我需要一个带有 join
的查询到另一个 table,这是无法完成的第一个变体(据我所知)。
我是否遗漏了什么或者第一个变体是否需要一些改进?
好吧,我不确定到底有什么区别,但让我尝试根据我的知识简要地表达一下:D
两个查询之间的主要区别是 Individual database queries
(通常我称之为 Extbase 查询,我不确定我是否正确!)另一个是 Doctrine DBAL Queries
1。个人数据库查询
在这里,根据现代方法扩展使用领域建模。因此,TYPO3 已经为 model
(通常是数据库 table)启用了安全连接,您可以将关系 table 连接与 Extbase 函数(Select、操作、连接等)结合使用。 ) 由TYPO3核心提供。
2。学说 DBAL
在这里,您使用 ConnectionPool
class 为数据库 table 手动启用连接。此外,您更有可能根据自己的需要建立关系(或加入您可以说!)。
更多:https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/Index.html
但是,如果 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% 正确的答案。欢迎大家指正:)
where I need to care about enablefields by myself
事实并非如此。默认情况下有 Restrictions
个活动,您可以使用简短命令启用或禁用每个 Restriction
。
我使用这两种方法,但我只在 Extbase 扩展上使用第一种,在所有其他扩展上使用第二种。 (是的,存在没有 Extbase 的扩展)