簡體   English   中英

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但有更多選項來指定查詢。

在第一個視圖中,您可以看到還有其他方法( eqequals )並且這些查詢沒有關系。 但兩者都在同一張桌子上工作。

現在我需要將我的所有工作從第一個變體更改為第二個變體,因為我需要一個查詢並join到另一個表,而第一個變體無法完成(據我所知)。
我錯過了什么還是第一個變體需要一些改進?

好吧,我不確定到底有什么區別,但讓我嘗試根據我的知識簡要地表達一些事情:D

兩個查詢之間的主要區別是Individual database queries (通常我稱之為 Extbase 查詢,我不確定我是否正確!)另一個是Doctrine DBAL Queries

1. 個別數據庫查詢

在這里,根據現代方法擴展使用域建模。 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.

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

2. Doctrine DBAL

在這里,您使用ConnectionPool class 為數據庫表手動啟用連接。 此外,您可以根據需要建立關系(或加入您可以說。)。

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

但是,如果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, ....
                );

請參閱: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/RestrictionBuilder/Index.ZFC35FDC70D5FC69D269883A822C7A3E

我知道這不是一個充分且 100% 正確的答案。 歡迎大家指正:)

我需要自己關心 enablefields 的地方

這不是真的。 默認情況下, Restrictions處於活動狀態,您可以使用簡短命令啟用或禁用每個Restriction

我使用這兩種方法,但我只在 Extbase 擴展上使用第一種,在所有其他擴展上使用第二種。 (是的,存在沒有 Extbase 的擴展)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM