2010-12-15 9 views
-1

Ich werde diese Frage mit dem Disclaimer einreichen, von dem ich weiß, dass es viele gute MVC-Frameworks (für PHP und andere Sprachen) gibt. Die Motivation hier ist zu verstehen. Und Entschuldigung für die Länge der Frage!Design von Assoziationen zwischen Modellen innerhalb eines MVC-Frameworks

Wenn es mit Beziehung kommt zwischen den Modellen zu tun haben (die übliche 00.59, man viele und etc.),

  1. Welches Modell für das Laden des Vereins zuständig ist?
  2. Wie soll die Assoziation geladen werden?

Zum Beispiel hat ein Benutzer eine Bildergalerie; Es gibt das Profil des Benutzers und die Bilder des Benutzers. Das Modell kann wie folgt aussehen:

class Model_User { 
    public function load($id) { /* loading code here*/ } 
} 

class Model_Photographs { 
    public function load($id) { /* loading code here */ } 
} 

Also für Frage # 1, Welche Klasse sollte alle Fotos laden, die ein Benutzer?

Wenn es in der Klasse Model_User ist, bedeutet dies, dass die Klasse jetzt von Model_Photographs abhängig ist. Sollte es eine andere Klasse sein?

Die zweite Frage ist , wie das Laden der Beziehung erfolgt.

Welches Design ist besser?

class Model_User { 
    public function load_photographs() { 

     $sql = "SELECT photographs.id, photographs.url, photographs.caption FROM 
       user_photographs, photographs WHERE 
       user_photographs.photoid = photographs.id AND 
       user_photographs.userid = {$this->id}"; 

     /* snipped */ 
    foreach ($results as $photo) 
    { 
     $photo = new Model_Photo(); 
     $photo->set($photo); 
     $this->photos[] = $photo; 
    } 

    } 
} 

Oder ist das besser?

class Model_User { 
    public function load_photographs() { 

     $sql = "SELECT photoid FROM user_photographs WHERE 
       user_photographs.userid = {$this->id}"; 

     /* snipped */ 
    foreach ($results as $photo_id) 
    { 
     $photo = new Model_Photo($photo_id); 
     $this->photos[] = $photo; 
    } 

    } 
} 

Der erste Code verwendet nur eine Abfrage, sondern erfordert Model_User die Felder zu wissen, von der Fotografie Tisch zu holen (die überhaupt nicht seine Domäne ist); Der zweite Code ist sauberer, führt aber zu mehr SQL-Abfragen.

+0

will eine strenge OOP Antwort, oder einfach nur eine Meinung? – yoda

+0

Strict OOP, wenn möglich – Extrakun

Antwort

3

MVC-Frameworks haben nichts mit einer Datenabstraktionsschicht wie der Active Record pattern zu tun. Ihre Modelle könnten vollständig handgenerierte Abfragen verwenden, um die gleiche Aufgabe zu erfüllen.

In diesem speziellen Fall sollte Ihr Benutzer die öffentliche Schnittstelle des Fotomodells und nicht die Fototabelle direkt verwenden. Auswählen von Fotos für eine Benutzer-ID angegeben sollen wie von etwas getan werden:

class Model_Photo { 
    public static function find_by_user($user_id) { 
    // select query goes here 
    } 
} 

Ihr Benutzermodell eine bequeme Methode zur Verfügung stellen könnte:

class Model_User { 
    function photos() { 
    return Model_Photo::find_by_user($this->id); 
    } 
} 
+0

Was meinst du mit einer 'überzeugen' Methode? – Extrakun

+0

@Extrakun So buchstabiere ich "Bequemlichkeit" um 2 Uhr morgens. Das tut mir leid. – meagar

Verwandte Themen