Closed DanielWeitenauer closed 1 year ago
Danke @DanielWeitenauer
@DanielWeitenauer eine alternative wäre gewesen, eine VIEW zu verwenden.
@alxndr-w Es gibt sicherlich mehrere Wege zum Ziel. Als jemand, der deutlich besser mit PHP als mit MySQL zurechtkommt, finde ich die Arbeit mit rex_yform_manager_query
jedoch einfacher und eleganter zu handhaben.
@DanielWeitenauer bleibt natürlich dir überlassen.
Ich profitiere jedenfalls immer davon, wenn mir jemand einen Tipp gibt über den Tellerrand hinauszuschauen - das Arbeiten direkt auf der DB ist oft deutlich performanter und die VIEW kapselt die JOINs so schön ab.
@DanielWeitenauer hast du mal n Beispiel damit mir klar wird, wie ich das nutzen kann?
@skerbis Ich kann dir meinen konkreten Anwendungsfall erklären: Ich habe ein Addon mit einer News-ähnlichen Struktur von Datensätzen. Diese Datensätze haben Inhalte, die für alle Sprachen gleich sind und über den Eltern-Datensatz verwaltet werden und Inhalte, die sprachspezifisch sind und in Kinder-Datensätzen über Inline-Relationen verwaltet werden. Für jede Sprache wird automatisiert ein Relationsfeld mit zugehöriger Datentabelle erzeugt. Ich kann wunderbar aus den Kinderdatensätzen die URLs erzeugen, doch für einige Informationen muss ich auf den Elterndatensatz zugreifen. Z.B. um ein Statusfeld abzufragen, um nur Datensätze auszugeben, die online sind. Das kann ich leicht anfügen:
rex_extension::register('URL_PROFILE_QUERY', static function (rex_extension_point $ep): void {
/** @var rex_yform_manager_query $query */
$query = $ep->getSubject();
/** @var Profile $profile */
$profile = $ep->getParam('profile');
// die Elterntabelle
$table = rex::getTable(Item::TABLE);
// der Namen-Präfix der Kindertabellen - es wird für jede Sprache eine eigene Kindtabelle erzeugt, deren Name dann mit der Sprach-Id erweitert wird
$table_content = rex::getTable(ItemContent::TABLE);
if (strpos($profile->getTableName(), $table_content) !== false) {
$query->leftJoin($table, null, 'data.item_id', $table.'.id');
$query->select($table.'.status');
$query->where($table.'.status', 0, '>');
}
$ep->setSubject($query);
});
@alxndr-w Ich denke, wenn ein durchdachtes Framework vorhanden ist, kann man es ruhig verwenden. Dafür sind Yform und das URL-Addon ja in erster Linie gedacht. Falls es mal auf die Performance ankommt, steht dem direkten Zugriff auf die Datenbank ja nichts im Wege.
Ah super danke.
Über diesen EP ließen sich komplexere Abfragen realisieren, als sie mit URL_PROFILE_RESTRICTION möglich sind. Es werden z.B. Abfragen weiterer Tabellen möglich. Ich verwalte z.B. Sprachversionen eines Datensatzes in Inline-Relationen. Das bedeutet, der Status wird im Haupt-Datensatz, die URL-Daten in den Inline-Datensätzen verwaltet. Über den EP kann ich die Daten zusammenführen.