Hallo Rolf,
[…] sicherlich hast Du doch auch eine Release-Klasse für die Release-Objekte, oder? Und eine User-Klasse für die User-Objekte.
ich habe bis jetzt nur eine Controller-Klasse für die Releases, die wiederum zwei Methoden hat – eine für eine GET-Anfrage und eine für eine POST. In der Methode für die GET-Anfrage befindet sich bspw. der Befehl Model::read( […] ). Wenn ich dich richtig verstanden habe, dann soll ich noch eine Model-Class für die Releases-Objekte erstellen?
Hast Du nicht? Na dann, ran! Diese Klassen müssen Propertys enthalten, die den DB-Columns entsprechen (gleiche Namen sind am einfachsten, sonst programmierst Du Dir die Finger mit Mappern wund), und ein paar Methoden, die die Model-Funktionen passend für diesen Objekttyp (äh, also diese Klasse) parametrieren.
Das sollte kein Problem sein. In der Releases.model-Klasse müssen also nur Properties instantiiert (sagt man das so?) werden und schon weiß die PDO-Methode, in welche Spalten die übertragenen Daten sollen?
Guck Dir fetchAll mit FETCH_CLASS (bzw. fetchClass) mal an. Die Klasse Release muss gar nicht viel enthalten, nur die Properties und das Interface zur Datenbank.
Interface zur Datenbank? Das ist mir neu. Was meinst du damit?
Ich habe im Ordner App/Models die Klasse Release erstellt und die sieht folgendermaßen aus:
class Release {
public int $id;
public int $value;
public string $game = '';
public static function readForGame( $page )
{
Model::dbRead( 'Release', 'releases', 'id, value, game', [ 'game' => $page ] );
}
}
Den Rest habe ich entsprechend deinem Vorschlag geändert, zum Beispiel dass jetzt die Ergebnisse über fetchAll( PDO::FETCH_CLASS, $class )
abgegriffen werden.
Jedoch erhalte ich die Fehlermeldung: Fatal error: Class "Release" not found in D:\Websites\framework\app\models\Model.php on line 53
Die entsprechende Code-Zeile ist genau die:
$results = $stmt -> fetchAll( PDO::FETCH_CLASS, $class );
Ach ja, und ein Flag "$isNew" oder so. Das setzt Du auf FALSE, wenn das Objekt aus der Datenbank geladen wurde, und auf TRUE, wenn es neu ist.
Ja, das mache ich, sobald ich hoffentlich das Prinzip und die Umsetzung hinter deinem Vorschlag verstanden habe. 😅
Wenn die fachlichen Propertys genauso heißen wie die DB-Spalten, macht PDO den Rest automatisch. Wenn nicht, wird es mühsamer, darauf gehe ich aber nur dann ein wenn Du das unbedingt wissen willst.
Das muss nicht sein. Die Properties werden wie die Spalten heißen.
Jetzt hast Du sicher auch die Idee für das Schreiben verstanden. Implementiere in der Release-Klasse (und in der User-Klasse und in der Game-Klasse und und und) eine Methode save(). Diese soll:
- abfragen, ob isNew gesetzt ist. Wenn ja, muss ein INSERT gemacht werden, sonst ein UPDATE.
- für INSERT ein Model::dbCreate aufrufen mit passenden Angaben für Spaltennamen und Werte
- für UPDATE ein Model::dbUpdate aufrufen mit passenden Angaben für zu ändernde Spalten, deren Werte und einer Condition um das richtige Element zu erwischen
Siehe oben. Das gehe ich an, sobald die Read-Methode funktioniert.
Viele Grüße
Boris