Hallo borisbaer,
Model::read?
Nö - sicherlich hast Du doch auch eine Release-Klasse für die Release-Objekte, oder? Und eine User-Klasse für die User-Objekte.
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.
Und dann sieht das nicht mehr so aus:
$releases = Model::read( 'releases', 'id, value, game', [ 'game' => $page ] );
sondern so:
$releases = Release::readForGame($page);
class Release {
...
public static function readForGame($gameId)
{
Model::read( 'Release',
'releases',
'id, value, game',
[ 'game' => $gameId ] );
}
}
class Model
{
static function read($className, $table, $column, $condition = [] )
{
...
$results = $stmt -> fetchAll( PDO::FETCH_CLASS, $className );
}
}
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.
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.
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.
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
Diese Funktionsaufrufe können gerne riesig sein. Das ist das Kabelknäuel unter der Arbeitsplatte, da guckt nachher keiner mehr hin.
In der eigentlichen Anwendung schreibst Du dann nur noch
$user->save();
und der Rest passiert unter der Haube.
Rolf
sumpsi - posui - obstruxi