From bc0f4eed8d4c8fbd8903f6f643f179fab7410340 Mon Sep 17 00:00:00 2001 From: Thomas Skerbis Date: Mon, 12 Aug 2024 15:12:03 +0200 Subject: [PATCH] findByCategories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Hinzufügen der `findByCategories`-Methode zur `Entry`-Klasse #### Zusammenfassung: In diesem Pull Request wird eine neue Methode `findByCategories` zur `Entry`-Klasse hinzugefügt. Diese Methode ermöglicht es, Einträge anhand einer oder mehrerer Kategorien zu finden, wobei der Status der Einträge ebenfalls berücksichtigt wird. Die Methode akzeptiert sowohl Strings als auch Arrays als Eingabeparameter für die Kategorie-IDs und ist kompatibel mit PHP 8.2. #### Änderungen im Detail: - **Neue Methode `findByCategories`:** - **Parameter**: - `string|array|null $category_ids`: Akzeptiert entweder eine kommagetrennte Liste von Kategorie-IDs als String, ein Array von Kategorie-IDs oder `null`. - `int $status`: Definiert den Mindeststatus der Einträge, die gefiltert werden sollen. - **Funktionalität**: - Wenn ein String übergeben wird, wird dieser in ein Array umgewandelt. - Die Methode verwendet `whereInList`, um die Einträge zu filtern, die den angegebenen Kategorien zugeordnet sind. - Es wird der `status` der Einträge berücksichtigt, sodass nur Einträge zurückgegeben werden, die einen bestimmten Status erfüllen. - **Typdeklaration**: - Die Methode nutzt die neuen Union Types von PHP 8.2 (`string|array|null`), um klar anzugeben, welche Typen akzeptiert werden. #### Anwendungsbeispiel: ```php // Suche nach Einträgen, die den Kategorien 1 und 2 zugeordnet sind und den Status 1 oder höher haben $entries = FriendsOfRedaxo\Neues\Entry::findByCategories([1, 2], 1); // Suche mit einer kommagetrennten Liste von Kategorien als String $entries = FriendsOfRedaxo\Neues\Entry::findByCategories('1,2', 1); // Suche nach allen Einträgen mit einem Status von 1 oder höher, ohne Kategorienfilter $entries = FriendsOfRedaxo\Neues\Entry::findByCategories(null, 1); ``` --- lib/neues_entry.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/neues_entry.php b/lib/neues_entry.php index 4941029..8551cb8 100644 --- a/lib/neues_entry.php +++ b/lib/neues_entry.php @@ -430,6 +430,37 @@ public static function findByCategory(?int $category_id = null, int $status = 1) return $query->find(); } + + /** + * Findet Einträge nach mehreren Kategorien. + * Finds entries by multiple Categories. + * + * @param string|array|null $category_ids Die IDs der Kategorien als String oder Array. / The IDs of the Categories as a String or Array. + * @param int $status Der Status der Einträge. / The status of the entries. + * @return rex_yform_manager_collection|null Die gefundenen Einträge oder null, wenn keine Einträge gefunden wurden. / The found entries or null if no entries were found. + * + * Beispiel / Example: + * $entries = FriendsOfRedaxo\Neues\Entry::findByCategories('1,2', 1); + * + * @api + */ + public static function findByCategories(string|array|null $category_ids = null, int $status = 1): ?rex_yform_manager_collection + { + $query = self::query()->where('status', $status, '>='); + + if ($category_ids) { + // Wenn es ein String ist, in ein Array umwandeln + if (is_string($category_ids)) { + $category_ids = explode(',', $category_ids); + } + + // whereInList anwenden + $query->whereInList('category_ids', $category_ids); + } + + return $query->find(); + } + /** * Gibt die URL des Eintrags zurück. * Returns the URL of the entry.