Ankündigung

Einklappen
Keine Ankündigung bisher.

TableDataGateway / ActiveRecord Pattern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • TableDataGateway / ActiveRecord Pattern

    Hallo,

    ich habe mal ein paar Fragen bezüglich der im Titel stehenden Pattern.

    Zunächst aber einmal ein Beispiel. In meiner Firma haben wir bestimmte Models um Daten aus einer Datenbank zu ermitteln. Angenommen die Tabelle heisst "User". Nun gibt es 2 Models, eins heisst User (extends DatabaseTableModel), das andere UserList (extends DatabaseTableListModel implements Iterrator).

    Wenn man nun 1 Datensatz auslesen (CRUD) will nimmt man das User-Objekt. Möchte man mehrere Datensätze auslesen (CRUD) muss man das UserList-Objekt nehmen.

    Ein UserList-Objekt enthält für jede Zeile in der Datenbank ein User-Objekt. Durch die Implementierung des Iterrators kann man das Objekt in einer foreach durchschleifen.

    Darin seh ich allerdings mehrere Nachteil. Man muss 2 User-Models pflegen und natürlich auch die DatabaseTableModel und DatabaseTableListModel Klasse.

    Bei Zend habe ich es so verstanden, das die im Endeffekt nur das UserList-Objekt hätten, dieser beinhaltet dann aber kein User-Objekt pro Zeile sondern ein UserList-Objekt pro Zeile. Sehe ich das richtig? Dann hätte also jede einzelne Zeile den Iterrator implementiert?

    Ist der Weg den meine Firma da geht überhaupt ein "vernünstiges" Pattern? Besser gesagt, ist es eins aus dem Titel genannten Pattern?

    Gruß


  • #2
    Bist du sicher das das UserList-Objekt nicht mehrere User-Objekte erzeugt und nur die Collection repräsentiert und den Iterrator natürlich dafür implementiert ? Wär' ja wohl schwachfug wenn man das schon bereitstellt die zuvor erzeugte Klasse nochmal aufzupinnen für "viele User"...

    User -> AR Pattern
    UserList -> TDG Pattern

    Insofern man unbedingt granulieren möchte und die Klassen auch wirklich read/write implementieren und nicht nur read, ja. Aber was spricht dagegen das Multi-Row Objekt zu benutzen um 1 Row aus der DB zu holen ?
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      Spricht ja nichts gegen das Multi-Row Objekt für 1 Eintrag zu nutzen. Nur hat das Multi-Row pro Eintrag ein Objekt ala AR Pattern oder einfach nur ein Array mit den Daten?

      Kommentar


      • #4
        Zum Verständnis, da ich mit der OO-Datenbankmaterie noch nicht 100% vertraut bin:

        Ich verstehe das gerade so, dass man Zugriff auf ein einzelnes User-Objekt über die User-Klasse bekommt. über UserList bekommt man dann Zugriff auf das User-Objekt während der Iteration, wie oben geschrieben eine Collection.

        Daher muss eigentlich nur das User-Objekt gepflegt werden, da hier da Userdaten abgefragt werden?

        Ich meine im AR-Pattern gibt es auch die möglichkeiten, neben einen einzelnen Datensatz (get, find, read) auf alle Datensätze (getAll, findAll, readAll) zu zugreifen. Damit kann man doch auch über Iteration per Foreach zugreifen. Wäre dieses vorgehen nicht komfotabler?

        MfG
        Marco
        Hybrid developer & Innovation engineer at http://grannyandsmith.com.

        Blogging about application development and workflows at http://www.marco-bunge.com.

        Kommentar


        • #5
          Darin seh ich allerdings mehrere Nachteil. Man muss 2 User-Models pflegen und natürlich auch die DatabaseTableModel und DatabaseTableListModel Klasse.
          Du pflegst ganz einfach alles was zum User gehört in der User-Klasse, bspw. eine confirm()-Methode und alles was du brauchst um User zu holen kommt in die UserList-Klasse, bspw. eine getConfirmedUser()-Methode.

          Da ist dann nichts doppelt und alles ist schön aufgeräumt.

          Kommentar


          • #6
            Also ich habe es nun wie folgt aufgebaut. Ich habe folgene "core" Models von denen abgeleitet werden kann.

            RowModel - ist die Grundlage für ein Singleline Model (kein Datenbankzugriff)
            DatabaseRowModel (extends RowModel) - hat Zugriff auf die Datenbank und diverse Datenbank-Methoden. Die Daten werden dann ins RowModel gespeichert

            RowsetModel (implements Iterator) - ist die Grundlage für ein Multiline Model (kein Datenbankzugriff)
            DatabaseRowsetModel (extends RowsetModel) - hat Zugriff auf die Datenbank und diverse Datenbank-Methoden. Die Daten werden dann ins RowsetModel gespeichert

            Nun kann man wie folgt vorgehen:

            User extends DatabaseRowModel - damit kann man zum Beispiel Methoden aufrufen ala "loadDataByPrimary(2)". Lädt dann die Daten des Users wo der Primary-Key 2 ist

            Wenn man allerdings mehre User auslesen möchte muss man ein weiteres Model anlegen:

            UserRowset extends DatabaseRowsetModel - nun kann man zum Beispiel folgende Methoden aufrufen "loadDataByField('user_id', array(1,2,3,4)). Lädt nun alle User mit der user_id 1-4. Würde man sich das 1. Objekt vom Rowset ausgeben lassen (*->current()) würde dies dem Objekttypen "User" besitzen.

            Ist dies soweit sauber umgesetzt oder gibt es was auszusetzen?

            Kommentar

            Lädt...
            X