Einzelnen Beitrag anzeigen
  #12 (permalink)  
Alt 14.12.2010, 20:24
Benutzerbild von mantiz
mantiz mantiz ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.845
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Wenn ich ehrlich bin, dann ist das ganze noch in der Entwicklung und ich würde es als pre-Alpha einstufen, das vielleicht noch ergänzend.

Den Primary speichere ich aus Faulheit, ganz einfach, ist immer gut, wenn man als Programmierer zu einem gewissen Grad faul ist.

Die einfache (soll heißen normale) fetch-Methode bekommt als ersten Parameter eine Bedingung als Array übergeben, wenn ich aber bereits weiß, dass die Bedingung lediglich auf den Primärschlüssel filtert, wieso sollte ich den Primärschlüssel jedes Mal mit angeben und ihn so über den Code verteilen?

Für mich bedeutet das: Zentralisierung.

Wie bereits erwähnt lässt sich so eine Methode "find($primary)" schreiben, welche mir einen Datensatz zurückliefert, der im Primärschlüssel den Wert von $primary besitzt, oder aber $primary ist ein Array, dann werden sämtliche Datensätze mit den entsprechenden Primärschlüsseln zurückgeliefert.
Mir ist bei meinen Codes aufgefallen, dass ich sehr häufig anhand der Primärschlüssel selektiere, das muss aber längst nicht bei jedem so sein.

Eine weitere Methode von DbTable ist z.B. "update($primary, array $data)", welche einen bzw. mehrere Datensätze entsprechend der in $data angegebenen Felder aktualisiert.

Wie gesagt, so lässt sich der Primärschlüssel fix ändern und da die Klasse teil eines Frameworks ist woran ich derzeit arbeite sollte diese auch so flexibel wie möglich sein.

Ansonsten müsste ich die Bedingung immer vollständig mit angeben, was bei mir z.B. so aussehen würde:
PHP-Code:
$commentModel->update(array('id' => 1), array('published' => 1)); 
Warum aber ständig "array('id' => 1)" schreiben, wenn "1" reichen kann?

Zusätzlich gibt es aber noch eine Methode "updateByCondition", wo man eine beliebige Bedingung angeben kann, es ist also nicht auf den Primärschlüssel beschränkt.

Wie gesagt ist die Klasse noch nicht fertig, aber falls bis dato komplizierte Queries benötigt werden besitzt die Klasse "DbConnection" bzw. "MysqlDbConnection" eine Methode "query", welche direkt ein SQL-Query entgegen nimmt und ausführt, darüber hat man dann sämtliche Freiheiten.

Zur Info:
DbConnection bzw. deren Erben sind bei mir die Datenbank-Wrapper um Funktionen wie "mysql_query" und Konsorten zu kapseln.

Aber wie gesagt, das muss nicht bei jedem so passen.

Dazu kommt, dass ich mich in letzter Zeit ein wenig mit Inversion-of-control beschäftigt habe, was wohl generell bei Frameworks sehr beliebt ist.
Im Prinzip geht es dabei darum, dass die Klassen bzw. Objekte sich die Daten, die sich brauchen, nicht selbst besorgen, sondern diese von "außen" (häufig automatisch, bei mir aber nicht) zugewiesen bekommen, das macht es aber zwangsweise nötig, dass diese lokal im Zielobjekt gespeichert werden.

Vorteil des ganzen ist, dass die Klasse weniger Abhängigkeiten besitzt und somit, so die Hoffnung, vielseitiger und einfacher eingesetzt werden kann.

Z.B. werden bei mir die Datenbankverbindungen automatisch vom Frontcontroller per lazy-loading anhand der Config erstellt und verbunden, ein (normaler) Controller muss sich zu keiner Zeit darum kümmern.

Aber es wäre denkbar, dass ich nur einen einzigen bestimmten Controller aus dem Framework für eine kleine Anwendung verwenden will.
Wenn dieser Controller z.B. lediglich eine DbConnection von außen erwartet, dann kann ich diese 2 bzw. 3 Klassen aus dem Framework auskoppeln und einzeln verwenden:
PHP-Code:
require('lib/DbConnection.php');
require(
'lib/MysqlDbConnection.php');
require(
'lib/SimpleController.php');

$dbConnection = new MysqlDbConnection();
$dbConnection->getConfig()
   ->
set('hostname''localhost')
   ->
set('username''...')
   ->
set('password''...')
   ->
set('database''...');

$controller = new SimpleController();
$controller->setDbConnection($dbConnection);
$controller->doSomething(); 
Wenn der Controller sich die DbConnection beispielsweise nur automatisch vom Frontcontroller holen würde und ihm nicht eine eigene zugewiesen werden könnte, müsste man u.U. recht viele Abhängigkeiten erfüllen, bis die Klasse vernünftig verwendet werden könnte.

Naja, meine Erklärung hinkt ein wenig, aber ich hoffe es wird so einigermaßen klar welche Gedanken dabei eine Rolle spielen.
Mit Zitat antworten
Sponsored Links