IT-MÜCKE

Xataface Relationships erklärt: m zu n

Beitragsdatum 13.11.2016
Letzte Aktualisierung 14.11.2016
Betrifft Xataface, diverse Versionen

In diesem Beitrag erkläre ich die Umsetzung einer m:n-Beziehung in Xataface als eine Art Tutorial.

Die offizielle Dokumentation fand ich teilweise etwas unübersichtlich und habe daher meine eigene Doku erstellt, die ich hier im Blog nun gerne auch Ihnen zur Verfügung stelle.

  • Relationships ermöglichen die Verknüpfung von Einträgen untereinander und erlauben 1:n oder n:n Beziehungen
  • Hier wird eine m:n (many to many) Beziehung erläutert
  • Beispiel:
    • Ein Journal-Eintrag wird mit Tags versehen
    • Je Tag gibt es also mehrere Einträge
    • Je Eintrag kann es mehrere Tags geben
  • In Xataface können Beziehungen auf unterschiedliche Arten und Weisen gelöst werden
  • Hier beschreibe ich eine Methode
  • Original-Xataface-Doku: xataface.com
  • Aufbau (fett markiert jeweils die für die relationship wichtigen Einträge):
    • Datenbank:
      • tbl_entry
        • entry_id
        • entry_text
        • entry_timestamp
      • tbl_tags
        • tags_id
        • tags_name
        • Tags_notiz
      • tbl_entry2tags (Join-Tabelle, um die Beziehungen untereinander abzubilden)
        • entry2tags_id
        • entry2tags_entryid
        • entry2tags_tagsid
    • Xataface-Applikation:
      root@s00156:/var/www/vhosts/it-muecke.de/db.it-muecke.de/projects/journal/tables# ll *
      tbl_entry:
        fields.ini
        relationships.ini
      
      tbl_entry2tags:
        fields.ini
        valuelists.ini
      
      tbl_tags:
        fields.ini
    • In tbl_entry/fields.ini ein zusätzliches Feld anfügen, das es nicht in der DB gibt. Über dieses erfolgt bei Eingabe oder Änderung eines Datensatzen die Auswahl der Tags:
      [tags]
      widget:label = "Tags"
      widget:type = checkbox
      ; ### Hier wird die Beziehung definiert:
      relationship = rel_tags
      ; ### Gibt an, dass das Feld angezeigt werden soll, obwohl es in der DB nicht existiert:
      transient = 1
    • Die dort genannte Beziehung rel_tags wird in tbl_entry/relationships.ini definert. Aus diesen Angaben zieht sich Xataface bei Eingabe oder Änderungn eines Datensatzen die Tags und bietet diese zur Auswahl an.:
      ; ### Der Name der Beziehung wird in der fields.ini angebenen (s.o.):
      [rel_tags]
      tbl_tags.tags_id = tbl_entry2tags.entry2tags_tagsid
      tbl_entry2tags.entry2tags_entryid = "$entry_id"
      
      ; ### Aufbau:
      [<relationship name>]
      <tabelle partner>.<partner id> = <tabelle join>.<partner id>
      <tabelle join>.<id> = "$<id>"
      ; ### wobei sich id auf die id des Eintrags in dieser Tabelle bezieht (in deren relationships.ini wir gerade sind)
    • Anstelle der IDs sollen in der Tabelle tbl_entry2tags die Tags (tags_name) sowie die Einträge (entry_text) angezeigt werden. Daher legen wir die zwei Dateien tbl_entry2tags/fields.ini und tbl_entry2tags/valuelists.ini an:
      ### tbl_entry2tags/fields.ini ###
      [entry2tags_id]
      visibility:list = hidden
      visibility:browse = hidden
      
      [entry2tags_tagsid]
      vocabulary = voc_tags
      filter = 1
      
      [entry2tags_entryid]
      vocabulary = voc_entry
      
      
      ### tbl_entry2tags/valuelists.ini ###
      [voc_tags]
      __sql__ = "SELECT tags_id, tags_name FROM tbl_tags ORDER BY tags_name"
      
      [voc_entry]
      __sql__ = "SELECT entry_id, entry_text FROM tbl_entry ORDER BY entry_text"
    • Die Join-Tabelle tbl_entry2tags sollte nun gegen jegliche Änderungen gesperrt werden, da sie ja automatisch befüllt wird und nur die Verknüpfung zwischen Tag und Entry herstellt. Dazu wird die Datei tbl_entry2tags/tbl_entry2tags.php erstellt:
      <?php
          class tables_tbl_entry2tags {
              function getPermissions(){
                  return Dataface_PermissionsTool::READ_ONLY();
              }
          }
      ?>
    • Ferner soll die Join-Tabelle Spalten aus der Tabelle tbl_entry anzeigen - diese Join-Tabelle soll später das Hauptwerkzeug werden. Dazu wir die Datei tbl_entry2tags/tbl_entry2tags.php erweitert:
      <?php
          class tables_tbl_entry2tags {
              function __sql__(){
                  return "select tbl_entry2tags.*, tbl_entry.entry_date, tbl_entry.entry_timestamp from tbl_entry2tags left join tbl_entry on tbl_entry2tags.entry2tags_entryid=tbl_entry.entry_id";
              }
              function getPermissions(){
                  return Dataface_PermissionsTool::READ_ONLY();
              }
          }
      ?>
    • Die SQL-Query platziert die Spalten aus der Tabelle tbl_entry in dieser Join-Tabelle.
    • Die Felder sollten daher entsprechend in der tbl_entry2tags/fields.ini definiert und angepasst werden.
    • Nun kann die Tabelle tbl_entry2tags als Suchtabelle für die Tags benutzt werden, der gesetzte Filter ermöglicht die Auswahl eines Tags - dann werden alle Einträge mit diesem Tag angezeigt:
      Join-Tabelle read only
      Tagsfilter aktiv

Quellen:


Ähnliche Themen im blog:
xataface


zurück