Jaký je rozdíl s těmito dotaz tříd v TYPO3?

0

Otázka

Používám extbase v mém prodloužení, a tak jsem *Repository třídy, kde můžu dělat jednoduché dotazy jako:

   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();
   }

to bude respektovat enableFields a další obvyklé podmínky.

na druhou stranu je zde možnost udělat to tímto způsobem:

   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();
    }

kde musím péče o enablefields sám ale mít více možností, jak upřesnit dotaz.

Na první pohled můžete vidět, že existují i jiné metody (eq vs equals) a tyhle dělat dotazy nemají žádný vztah. Ale oba pracují na stejném stole.

Teď jsem v místě, kde potřebuji změnit všechny své práce od první k druhé variantě, jak jsem třeba dotaz s join k jinému stolu, které nemůže být provedeno s první varianta (pokud vím).
Uniklo mi něco, nebo se první varianta potřebuje nějaké vylepšení?

class sql typo3 typo3-10.x
2021-11-23 08:09:16
2

Nejlepší odpověď

1

No, nejsem si úplně jistý rozdíl, ale pokusím se vyjádřit věci v krátkém dle mých znalostí :D

Hlavní rozdíl mezi oběma dotazy je Individual database queries (Obvykle říkám to Extbase dotaz, nejsem si jistá, že mám pravdu, nebo ne!) a další je Doctrine DBAL Queries

1. Jednotlivé databázové dotazy

Zde, stejně jako na moderní přístup, rozšíření, použití Domény modelování. Takže, TYPO3 již umožňuje zabezpečené připojení pro model (Typicky databázové tabulky) a můžete použít relační tabulce souvislosti s Extbase funkce (Vyberte, provozní, připojit atd..) poskytována TYPO3 jádro.

Pro více: https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/6-Persistence/3-implement-individual-database-queries.html

2. Doctrine DBAL

Zde můžete povolit připojení ručně pro databázové tabulky pomocí ConnectionPool třídy. Také, budete mít více proveditelnosti k vytvoření vztahu (nebo se Připojit můžete říct, že!) podle vaší potřeby.

Pro více: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/Index.html

Nicméně, můžete použít restriction pro péči pokud hidden delete atd.

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

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

Vím, že to není dostatečné a 100% správnou odpověď. Každý může přivítat mě opravte :)

2021-11-23 08:38:00

velmi užitečné je první odkaz, který poukazuje, abych dokumentace extbase dotazy. A tady je dokumentace k spojení, které se provádí implicitní odkazování na pole ze související tabulky, jako v kapalině: field_to_relation_table.field_in_relation. ne nutně zavolat metodu připojit.
Bernd Wilke πφ

Také stojí za zmínku, je první metoda bude vracet objekt další pole. Na objekt můžete snadněji získat dítě související stuf. Nicméně podle mých zkušeností Extbase Dotaz-objekt metody bych použít pouze pro velmi jednoduché věci, a dokonce i s prodloužením stávající modely jako fe_user nebo zprávy nebudu to už používat, aby se zabránilo podivné chyby, jako forge.typo3.org/issues/75399
Jacco van der Post
0

kde musím péče o enablefields sám

Že to není pravda. Ve výchozím nastavení jsou Restrictions aktivní a můžete povolit nebo zakázat každý Restriction s krátký příkaz.

Já používám oba přístupy, ale já používám ten první jen na Extbase rozšíření, druhá na každé další rozšíření. (Ano, existují rozšíření, aniž Extbase)

2021-11-23 08:29:48

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................