Zitat von
andreas.schempp
Ich habe das Gefühl es lassen sich hier die Ansichten ganz einfach unterscheiden zwischen den "gelernten" Entwicklern und den Quereinsteigern. Ganz ehrlich, ich hab keine Ahnung was DBAL+ORM ist (klar kann ich raten), denn ich habe nie Java oder ähnliches gelernt. Einige hier kommen aus der Java-Welt und wünschen sich entsprechende Funktionen. Ihr scheint dabei zu vergessen das Contao ein WebCMS ist, und kein Applikations-Framework (wie Synfony). Ich habe leichte Erfahrung mit einem echten MVC-Web-Framework (Magento und ActiveCollab) und einem entsprechenden System würde ich mit Sicherheit den Rücken kehren... Contao's Vorteil ist sein vereinfachter Umgang mit den Theorien, was die Anwendung für alle nicht-Java-Entwickler bedeutend einfacher macht.
Ich bin zwar auch ein Java Entwickler, habe das alles aber noch vor meiner Java Zeit kennen gelernt und zwar in PHP, bspw. mit CakePHP. object-relational mapping (ORM) bedeutet vereinfacht gesagt, du hast ein Objekt mit Daten, wenn du es in die Datenbank speichern willst, gibst du dem System dein Objekt, sozusagen "$db->store($objDaten)". Willst du Daten abholen, bekommst du kein Result Set und musst dir alles von Hand raus holen, sondern ein Objekt: "$objDaten = $db->get($intId);". Dieses kann im Prinzip sogar PDO, nur ist ORM mehr. Wenn es z.B. um verknüpfte Objekte geht. Beispielsweise eine Klasse Group, diese beinhaltet dann verschiedene User.
Ich möchte dies an einem kurzen Beispiel demonstrieren, hier die 2 Model Klassen Group und User.
PHP-Code:
<?php
class Group
{
$arrUsers = array();
public function addUser(User $objUser)
{
if (!$this->hasUser($objUser))
{
$this->arrUsers[] = $objUser;
$objUser->addGroup($this);
}
}
}
class User
{
$arrGroups = array();
public function addGroup(Group $objGroup)
{
if (!$this->hasGroup($objGroup))
{
$this->arrGroups[] = $objGroup;
$objGroup->addUser($this);
}
}
}
?>
Jetzt hast du 2 Möglichkeiten, dies mittels ORM zu benutzen.
Variante 1:
PHP-Code:
<?php
$objUser = $daoUser->get($intId);
$objUser->addGroup($objAdminGroup);
$daoUser->store($objUser);
?>
Variante 2:
PHP-Code:
<?php
$objGroup = $daoGroup->get($intId);
$objGroup->addUser($objUser);
$daoGroup->store($objGroup);
?>
Mehr ist NICHT notwendig. Du musst dir keine Gedanken um irgendwelche Relationen oder sonstwas machen. Das ORM System für die Speicherung der einzelnen Verbindungen. Du kannst sogar folgendes machen:
PHP-Code:
<?php
$objUser = $daoUser->get($intId);
$objUser->username = 'Tristan';
$objGroup = $daoGroup->get($intId);
$objGroup->addUser($objUser);
$daoGroup->store($objGroup);
?>
Das reicht aus um sowohl die Gruppe, als auch den User zu speichern! Das ist doch wohl deutlich einfacher zu benutzen und auch zu verstehen. Denn Datenbankzugriffe sind vollständig transparent. Jeder nicht-Entwickler, dem ich das erkläre hat dieses ORM Prinzip 100 mal schneller verstanden, als wenn ich ihm die ganzen SQL Queries hätte erklären müssen.
Erklärt habe ich die praktische Anwendung, die Theorie sagt eigentlich nur eines: Du arbeitest beim Programmieren nicht mehr mit Tabellen und Zeilen, sondern mit Listen von Objekten.
Database Abstraction Layer (DBAL) ist eigentlich nichts weiter, als eine eigene SQL Schicht. Anstatt natives DB-SQL zu schreiben (z.B. für MySQL), schreibst du SQL Code, der von der DBAL auf den nativen Code umgesetzt wird. Hibernate verwendet einen völlig eigenen SQL Syntax, den HQL Syntax. HQL ist nichts weiter als SQL, erweitert um eine gewisse Menge von Funktionen. Diese Funktionen werden dann von Hibernate auf die native Funktion umgeschrieben. Mit DBAL ist es dir möglich, die Datenbank auf der das System läuft auszutauschen, ohne das du auch nur eine einzige Zeile Code anpacken musst!
Im Prinzip haben wir jetzt schon durch die DB Treiber eine Vorstufe der DBAL, aber das ist eben nur ein Treiber oder die Verbindung zur Datenbank. Die Nutzung erfolgt weiterhin über nativen SQL Code. Afaik ist Doctrine sogar in der Lage, bestimmte native Funktionen umzuschreiben und auf eine andere Datenbank abzubilden. Oder anders gesagt, du schreibst MySQL Code und Doctrine wandelt dir diesen in PostgreSQL Code um.
MfG Tristan