我在我的擴展中使用了 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到另一個表,而第一個變體無法完成(據我所知)。
我錯過了什么還是第一個變體需要一些增強?
uj5u.com熱心網友回復:
好吧,我不確定到底有什么區別,但讓我嘗試根據我的知識簡短地表達一下: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用于照顧 ifhidden delete等。
$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% 正確的答案。歡迎大家指正:)
uj5u.com熱心網友回復:
我需要自己關心 enablefields 的地方
這不是真的。默認情況下,有Restrictions活動的,您可以Restriction使用短命令啟用或禁用每個。
我使用這兩種方法,但我只在 Extbase 擴展上使用第一種,在所有其他擴展上使用第二種。(是的,存在沒有 Extbase 的擴展)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364458.html
上一篇:列印類屬性期間的語法錯誤
下一篇:如何列印沒有任何特殊字符的字典?
