Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | repository_datenbank [2023.12.12 16:02] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Datenbank Funktionen des Repository ====== | ||
+ | |||
+ | 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, | ||
+ | |||
+ | ===== Das QueryInterface ===== | ||
+ | |||
+ | Über das QueryInterface werden Anfragen an die Datenbank gestellt. | ||
+ | |||
+ | |||
+ | ==== Einfache Listenfunktion ==== | ||
+ | |||
+ | |||
+ | public function findAllBlogs() | ||
+ | { | ||
+ | $query = $this-> | ||
+ | $result = $query-> | ||
+ | return $result; | ||
+ | } | ||
+ | | ||
+ | | ||
+ | ==== Listenfunktion mit Sortierung ==== | ||
+ | |||
+ | public function findOrderedBlogs() | ||
+ | { | ||
+ | $query = $this-> | ||
+ | $query-> | ||
+ | ' | ||
+ | )); | ||
+ | $result = $query-> | ||
+ | return $result; | ||
+ | } | ||
+ | | ||
+ | ==== Listenfunktion mit Sortierung und Offset ==== | ||
+ | |||
+ | **Wichtige Parameter bei dieser Funktion:** | ||
+ | * Übergabe von Parametern | ||
+ | * Ordering nach Parameter | ||
+ | * Offset nach Parameter | ||
+ | |||
+ | public function findBlogs($blogLimit, | ||
+ | { | ||
+ | $query = $this-> | ||
+ | $query-> | ||
+ | ' | ||
+ | )); | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $result = $query-> | ||
+ | return $result; | ||
+ | } | ||
+ | | ||
+ | ==== Suche nach Text in einem Feld ==== | ||
+ | |||
+ | /** | ||
+ | * Find all posts with a distinct Kategorie | ||
+ | | ||
+ | * @param int $katid | ||
+ | * @param int $limit | ||
+ | * @param int $offset | ||
+ | * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface | ||
+ | */ | ||
+ | public function findByKategorie($katid, | ||
+ | { | ||
+ | $query = $this-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | ' | ||
+ | )); | ||
+ | $result = $query-> | ||
+ | return $result; | ||
+ | } | ||
+ | |||
+ | ==== Volltextsuche ==== | ||
+ | |||
+ | /** | ||
+ | * Find all posts with a title or content which contains the specified search word. | ||
+ | | ||
+ | * @param string $searchWord | ||
+ | * @param int $limit | ||
+ | * @param int $offset | ||
+ | * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface | ||
+ | */ | ||
+ | public function findBySearch($searchWord, | ||
+ | { | ||
+ | $query = $this-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | ) | ||
+ | ); | ||
+ | $query-> | ||
+ | $query-> | ||
+ | $query-> | ||
+ | ' | ||
+ | )); | ||
+ | $result = $query-> | ||
+ | return $result; | ||
+ | } | ||
+ | ==== Zähler (Counter) integrieren ==== | ||
+ | |||
+ | |||
+ | public function getBlogKategorienCounter($katid) | ||
+ | { | ||
+ | $query = $this-> | ||
+ | $query-> | ||
+ | $result = $query-> | ||
+ | return $result; | ||
+ | } | ||
+ | ==== Ergebnisse sortieren ==== | ||
+ | |||
+ | **Sortierung in absteigender Reihenfolge: | ||
+ | |||
+ | $query-> | ||
+ | ' | ||
+ | )); | ||
+ | | ||
+ | **Sortierung in aufsteigender Reihenfolge: | ||
+ | |||
+ | $query-> | ||
+ | ' | ||
+ | )); | ||
+ | ===== Der ConnectionPool ===== | ||
+ | |||
+ | Ab der LTS 9 von TYPO3 werden SQL Anfragen an die Datenbank über diese Klasse gemacht. | ||
+ | |||
+ | **Einbindung des ConnectionPool: | ||
+ | |||
+ | <?php | ||
+ | namespace Ibk\Ibkblog\Domain\Repository; | ||
+ | | ||
+ | use TYPO3\CMS\Core\Utility\GeneralUtility; | ||
+ | use TYPO3\CMS\Core\Database\ConnectionPool; | ||
+ | | ||
+ | ==== Name einer Kategorie auslesen ==== | ||
+ | |||
+ | |||
+ | public function getBlogKategorienName($katid) | ||
+ | { | ||
+ | $table = " | ||
+ | $queryBuilder = GeneralUtility:: | ||
+ | $katNameArray = $queryBuilder -> | ||
+ | -> | ||
+ | ->where( | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | -> | ||
+ | -> | ||
+ | | ||
+ | $katName = $katNameArray[' | ||
+ | return $katName; | ||
+ | } | ||
+ | ==== Mehrere Tabellen mit JOIN abfragen ==== | ||
+ | |||
+ | **Wichtige Elemente dieser Funktion:** | ||
+ | * Kreuztabellenabfrage mit Join über zwei Felder | ||
+ | * Ordering in aufsteigender Reihenfolge | ||
+ | * Gruppierung von Ergebnissen | ||
+ | * Zähler für gruppierte Ergebnisse | ||
+ | * Volltextsuche mit auskommentierten " | ||
+ | |||
+ | public function tagShow($pid) | ||
+ | { | ||
+ | $tagShowArray = []; | ||
+ | $table = " | ||
+ | $queryBuilder = GeneralUtility:: | ||
+ | |||
+ | $tagShowArray = $queryBuilder | ||
+ | -> | ||
+ | -> | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | -> | ||
+ | ->join( | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | ) | ||
+ | ->where( | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | ) | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | | ||
+ | return $tagShowArray; | ||
+ | } | ||
+ | | ||
+ | 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 = " | ||
+ | $queryBuilder = GeneralUtility:: | ||
+ | |||
+ | $tagArray = $queryBuilder | ||
+ | -> | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | ->where( | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | ) | ||
+ | -> | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | ) | ||
+ | -> | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | ) | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | |||
+ | |||
+ | ==== Volltextsuche über mehrere Felder ==== | ||
+ | | ||
+ | /** | ||
+ | * Find number of all posts with a title or content which contains the specified search word. | ||
+ | | ||
+ | * @param string $searchWord Search word to look for. | ||
+ | * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface | ||
+ | */ | ||
+ | public function findNumberBySearch($searchWord) | ||
+ | { | ||
+ | $table = " | ||
+ | $queryBuilder = GeneralUtility:: | ||
+ | $idArray = $queryBuilder -> | ||
+ | -> | ||
+ | -> | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ), | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ), | ||
+ | $queryBuilder-> | ||
+ | ' | ||
+ | $queryBuilder-> | ||
+ | ) | ||
+ | ) | ||
+ | -> | ||
+ | -> | ||
+ | |||
+ | return $idArray; | ||
+ | } | ||
+ | |||
+ | ==== Neues Objekt im Blog speichern ==== | ||
+ | |||
+ | 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, | ||
+ | { | ||
+ | $message = 'Der Beitrag wurde gespeichert'; | ||
+ | $queryName = $kommentar-> | ||
+ | $queryEmail = $kommentar-> | ||
+ | $queryKommentar = $kommentar-> | ||
+ | $queryDatum = $kommentar-> | ||
+ | $queryPid = $kommentar-> | ||
+ | $pos = strrpos($blog, | ||
+ | $queryBlog = intval(substr($blog, | ||
+ | | ||
+ | ## Kommentar zu einem Beitrag speichern | ||
+ | $queryBuilder1 = GeneralUtility:: | ||
+ | -> | ||
+ | $save1 = $queryBuilder1 | ||
+ | -> | ||
+ | -> | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ]) | ||
+ | -> | ||
+ | | ||
+ | ## Anzahl bisheriger Kommentare auslesen und um 1 erhöhen | ||
+ | $queryBuilder2 = GeneralUtility:: | ||
+ | -> | ||
+ | $save2 = $queryBuilder2 -> | ||
+ | -> | ||
+ | ->where( | ||
+ | $queryBuilder2-> | ||
+ | ) | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | | ||
+ | $queryBuilder3 = GeneralUtility:: | ||
+ | -> | ||
+ | $kommentarnew = $save2[' | ||
+ | | ||
+ | ## Neue Anzahl Kommentare in Blog Objekt speichern | ||
+ | $save3 = $queryBuilder3 -> | ||
+ | ->where( | ||
+ | $queryBuilder3-> | ||
+ | ) | ||
+ | -> | ||
+ | -> | ||
+ | | ||
+ | return $message; | ||
+ | } | ||
+ |