Table-Row Pattern?

mAu

Erfahrenes Mitglied
Hallo Community.
Ich steh mal wieder vor einem "Problem". Ich habe jetzt des Öfteren in Quellcodes Konstrukte alá
PHP:
$news = News::fetchByPK(1); // hole News nach Primärschlüssel (aus DB oder sonstiges)
$comments = $news->hasMany('comments');
Mir persönlich sagt das sehr zu, da man ja dadurch die SQL-Anweisungen in separaten Klassen hat und die restliche Anwendung somit nicht damit "belastet" wird. Außerdem kann man ja dann einfach auf z.B. Textfiles umsteigen.
Nur stellt sich mir die Frage, wie man das am besten implementiert.
Ich dachte, dass ich eine abstrakte Klasse BaseTable habe, von der ich eben die spezifischen SQL-Tabellen ableite und die Felder, Primärschlüssen etc. in den spezifischen Klassen angebe (meines Wissens ist das das Table-Data-Gateway Pattern).
Wenn ich jetzt eine Query auf eine Tabelle ausführe, bekomme ich entweder eine Instanz von RowSet, bei mehreren Tabellenzeilen, oder eine Instanz der Klasse Row zurück.
Diese kann ich dann über die Setter-/Getter-Funktionen manipulieren und zum speichern/updaten übergebe ich einfach die Instanz der Rowklasse an die Tableklasse.
Jetzt stellt sich mir u.A. die Frage, ob mein Ansatz richtig ist und weiterhin, wie ich die hasOne() und hasMany() Methoden am Besten implementiere.
Soll ich den Klassen, die eine Andere als Parent habe (z.B. Comments als Parent News) ein Attribut $_relatedTableField geben, welches ich dann wenn ich eine Tabelle von der BaseTable-Klasse ableite setze?
Z.b. bei der Comments dann:
PHP:
class Comments extends BaseTable
{
    protected $_relatedTableField = 'news_id';
}
Oder gibt's da eine elegantere Lösung? Vielleicht durch Vererbung? Na, ich warte einfach mal auf eure Tipps :)

Für weitere Anregungen, Verbesserungsvorschläge, Lob etc. bin ich offen :) Denn ich bin noch nicht sonderlich vertraut mit Design Pattern.

Nachtrag
Ist das UML-Diagramm so überhaupt richtig (abgesehen davon, dass die meisten Attribute public sind, was nicht meine Absicht ist/war)? :)
 

Anhänge

  • row-table.jpg
    row-table.jpg
    36,2 KB · Aufrufe: 29
Zuletzt bearbeitet:
Uiuiui anspruchsvolle PHP-Frage :)


... die Frage, ob mein Ansatz richtig ist.
Richtig oder falsch gibt's nicht ...

Ich finde deinen Ansatz soweit ganz gut. Vor allen Dingen für Schreibfaule ganz praktisch - einmal eine API basteln und ihr die ganze Arbeit übergeben.;)

Wenn ich jetzt eine Query auf eine Tabelle ausführe, bekomme ich entweder eine Instanz von RowSet, bei mehreren Tabellenzeilen, oder eine Instanz der Klasse Row zurück.
Hier würde ich von vorne rein 2 Funktionen machen, die eine gibt eine Instanz von Row - also die erste ( bzw einzige ) Reihe - zurück, die andere eine Instanz von RowSet, wobei da dann auch nur eine Reihe drin sein kann.

hasOne() und hasMany() Methoden
Da würde ich zuerst festlegen, wie die DB-Tabellen aussehen sollen:
zB:
Eine Tabelle hat immer die Spalte id als primary key.
Wenn eine Tabelle mit einer anderen verbunden ist, würde ich dann eine Spalte namens tabelle_id reinpacken. Also:
Code:
CREATE TABLE 'comments' (
`id` INT( 11  )  NOT  NULL  AUTO_INCREMENT  PRIMARY  KEY ,
`news_id` INT(11) NOT NULL,
/* noch ein paar andere spalten */
INDEX (  `news_id`)
)
Dann würden die Funktionen so aussehen:
PHP:
class News
{
   # Jeeede Menge anderer Sachen
   public function hasOne($table)
   {
      return mysql_num_rows(mysql_query("SELECT * FROM ".$table." WHERE '".$this->table."_id' =".$this->id,$this->dbh))===1?true:false;
   }
   public function hasMany($table)
   {
      return mysql_num_rows(mysql_query("SELECT * FROM ".$table." WHERE '".$this->table."_id' =".$this->id.",$this->dbh));
   }
}

So ich muss jetzt essen :D
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mAu
Zurück