Hallo ich habe folgendes Problem:
Ich habe Kategorien und Produkte in einer n:m Beziehung.
Die Sortierung der Produkte im FE erfolgt natürlich passent zu der Sortierung wie sie in der Kategorie angegeben ist.
Wenn man im Produkt ist soll man nun einen Link bekommen für das nächste, bzw. vorherige Produkt in dieser Kategorie.
Mein Ansatz war im Repository ein eigenes sql Statement zu nutzen, dass die entsprechenden Daten aus der mm Tabelle ausliest. Leider will das Repository aber immer ein Model zurückgeben und nicht einfach nur ein Array mit den Daten der Abfrage.
Ein weiter Ansatz von mir ist, dass ich im Produkt Controller das Kategorie Repository nach der Kategorie abfrage, mir alle Produkte zu der Kategorie geben lasse und dann in einer foreach Schleife alle Produkte durchlaufe um dann die ID des nächsten bzw. vorherigen Produkts an fluid weiterzugeben, Zwecks Link Bildung. Funktioniert soweit auch nur ist das sowas von unperformant, dass ich diesen Ansatz nicht weiter verfolgen möchte.
Hoffe irgendwer hat eine Idee wie man das Problem performant lösen kann oder kann mir bei meinem nicht funktionierenden Ansatz weiterhelfen.
Gruß und Danke im vorraus
Eydamos
Ich habe jetzt rausgefunden wie ich meinen Lösungsansatz weiter verfolgen kann.
Die fertige Funktion sieht so aus:
public function findPrevNextUid($foreignUid, $localUid)
{
$query = $this->createQuery();
// $query returns Array and not a Model
$query->getQuerySettings()->setReturnRawQueryResult(true);
// get sorting for this product
$query->statement("SELECT `sorting` FROM `tx_myext_category_product_mm` WHERE `uid_foreign` = ? AND `uid_local` = ?", array($foreignUid, $localUid));
$pos = $query->execute();
$pos = $pos[0]["sorting"];
// get current position -1 for previous product
$query->statement("SELECT `uid_foreign` FROM `tx_myext_category_product_mm` WHERE `sorting` = ? AND `uid_local` = ?", array($pos-1, $localUid));
$prev = $query->execute();
// get current position +1 for next product
$query->statement("SELECT `uid_foreign` FROM `tx_myext_category_product_mm` WHERE `sorting` = ? AND `uid_local` = ?", array($pos+1, $localUid));
$next = $query->execute();
// if var is empty no product found (current product is first or last product)
$return["prev"] = (empty($prev)) ? 0 : $prev[0]["uid_foreign"] ;
$return["next"] = (empty($next)) ? 0 : $next[0]["uid_foreign"] ;
return $return;
}
Lösung des Problems ist die Zeile 5:
$query->getQuerySettings()->setReturnRawQueryResult(true);
Dadurch sagt man Extbase, dass man kein Model zurückbekommen möchte, sondern ein array was die Daten beinhaltet.