[英]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.