Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
repository_datenbank [21/09/2018 15:41]
Thomas Berscheid [Mehrere Tabellen mit JOIN abfragen]
repository_datenbank [03/05/2019 10:17] (aktuell)
Thomas Berscheid [Mehrere Tabellen mit JOIN abfragen]
Zeile 2: Zeile 2:
  
  
-Daten aus der Datenbank holen, schreiben oder bearbeiten+Sinn des Repository in einer Extension ist es, Daten aus der Datenbank holen, schreiben oder bearbeiten
 +Neben dem bisherigen QueryResultInterface gab es im Repository stets die Möglichkeit,​ Datenbanken direkt mit SQL-Code abzufragen. Dies ist mit der LTS 9 von TYPO3 nicht mehr möglich. Entsprechende Abfragen müssen umgeschrieben werden. Für den Fall des IBK Blogs habe ich diese exemplarisch durchgezogen. Der Aufwand lohnt sich, denn man erhält nicht nur bessere Fehlermeldungen bei Fehlern in der SQL-Syntax, der Code wird auch strukturierter und leichter durchschaubar.
  
 ===== Das QueryInterface ===== ===== Das QueryInterface =====
Zeile 79: Zeile 80:
    * Find all posts with a title or content which contains the specified search word.    * Find all posts with a title or content which contains the specified search word.
    ​* ​    ​* ​
-   * @param string $searchWord Search word to look for. +   * @param string $searchWord ​    ​Search word to look for. 
-   * @param int    $limit ​     How many posts should be found. +   * @param int    $limit ​         How many posts should be found. 
-   * @param int    $offset ​   Where the search should start+   * @param int    $offset ​        ​Where the search should start
    * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface    * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface
    */    */
Zeile 166: Zeile 167:
   public function tagShow($pid)   public function tagShow($pid)
   {   {
-    $queryBuilder = GeneralUtility::​makeInstance(ConnectionPool::​class)->​getQueryBuilderForTable('​tx_ibkblog_domain_model_tag'​);+    ​$tagShowArray = []; 
 +    $table = "​tx_ibkblog_domain_model_tag";​ 
 +    ​$queryBuilder = GeneralUtility::​makeInstance(ConnectionPool::​class)->​getQueryBuilderForTable($table);
                
     $tagShowArray = $queryBuilder ​     $tagShowArray = $queryBuilder ​
Zeile 197: Zeile 200:
   }   }
     ​     ​
-Wie man an diesem Beispiel sieht: Die Nutzung der ConnectionPool Klasse bringt einen sehr strukturierten Code mit sich, anhand dessen man Monate nach dem Schreiben der Abfrage recht schnell versteht, was diese Funktion leistet.+Wie man an diesem Beispiel sieht: Die Nutzung der **ConnectionPool** Klasse bringt einen sehr strukturierten Code mit sich, anhand dessen man Monate nach dem Schreiben der Abfrage recht schnell versteht, was diese Funktion leistet. 
 + 
 +==== Kreuztabellenabfrage über mehrere Felder ==== 
 + 
 +Für die Bildergalerie auf der Georgienseite benötigen wir für eine Filterung nach Tags eine Kreuztabellenabfrage. Bilder und Tags stehen in einer n:m Beziehung zueinander. Entsprechend müssen die vorhandenen Tags und ihre Verknüpfung abgefragt werden. 
 + 
 +  $tagArray = []; 
 +  $table = "​tx_ibkbilder_domain_model_tag";​ 
 +  $queryBuilder = GeneralUtility::​makeInstance(ConnectionPool::​class)->​getQueryBuilderForTable($table);​ 
 + 
 +  $tagArray = $queryBuilder  
 +    ->​select('​tx_ibkbilder_domain_model_tag.tag',​  
 +      '​tx_ibkbilder_bilder_tag_mm.uid_local',​  
 +      '​tx_ibkbilder_bilder_tag_mm.uid_foreign',​  
 +      '​tx_ibkbilder_domain_model_bilder.uid',​  
 +      '​tx_ibkbilder_domain_model_bilder.bildergalerie'​) 
 +    ->​from('​tx_ibkbilder_domain_model_tag'​) 
 +    ->​from('​tx_ibkbilder_bilder_tag_mm'​) 
 +    ->​from('​tx_ibkbilder_domain_model_bilder'​) 
 +    ->​where( 
 +      $queryBuilder->​expr()->​eq( 
 +        '​tx_ibkbilder_bilder_tag_mm.uid_local',​  
 +        $queryBuilder->​quoteIdentifier('​tx_ibkbilder_domain_model_bilder.uid'​) 
 +      ) 
 +    ) 
 +    ->​andWhere( 
 +      $queryBuilder->​expr()->​eq( 
 +        '​tx_ibkbilder_domain_model_tag.uid',​  
 +        $queryBuilder->​quoteIdentifier('​tx_ibkbilder_bilder_tag_mm.uid_foreign'​) 
 +      ) 
 +    ) 
 +    ->​andWhere( 
 +      $queryBuilder->​expr()->​eq( 
 +        '​tx_ibkbilder_domain_model_bilder.bildergalerie',​  
 +        $queryBuilder->​createNamedParameter($bildergalerie,​ \PDO::​PARAM_INT) 
 +      ) 
 +    ) 
 +    ->​orderBy('​tx_ibkbilder_domain_model_tag.tag',​ '​ASC'​) ​            
 +    ->​groupBy('​tx_ibkbilder_domain_model_tag.tag'​) ​            
 +    ->​execute() 
 +    ->​fetchAll();​ 
 + 
 ==== Volltextsuche über mehrere Felder ==== ==== Volltextsuche über mehrere Felder ====
   ​   ​
Zeile 234: Zeile 279:
 ==== Neues Objekt im Blog speichern ==== ==== Neues Objekt im Blog speichern ====
  
-Bei dieser Funktion kommen mehrere Methoden des ConnectionPool zum Einsatz+Bei dieser Funktion kommen mehrere Methoden des ConnectionPool zum Einsatz. Nach Stand September 2018 der TYPO3 Version 9 DEV sollen Verbindungen nicht wiederverwendet werden. Daher wird hier für jede Anfrage an die Datenbank eine neue Instanz des ConnectionPool initialisiert.
  
   public function saveBlogKommentar($kommentar,​ $blog)   public function saveBlogKommentar($kommentar,​ $blog)
  • repository_datenbank.1537537288.txt.gz
  • Zuletzt geändert: 21/09/2018 15:41
  • von Thomas Berscheid