Sep 03

Wie mein Kollege Fabian Freiburg im das-ist-drin.de Blog berichtet, haben die Entwickler von Doctrine ihr Versprechen wahr gemacht und in der Nacht vom 31. August 2007 den Release Candidate Nummer 1 des gleichnamigen Datenbank ORM Tools für PHP veröffentlicht.

Wie ich finde eine sehr respektable Leistung. Ich verfolge das Doctrine Projekt bereits seit der Revision 7xx und bin überrascht, welche Fortschritte ein Projekt in so kurzer Zeit machen kann. Natürlich wurde der Entwicklungsfortschritt von Doctrine sehr durch das Google Summer of Code Projekt im diesen Jahr begünstigt, jedoch muss man auch sagen, dass nicht nur Zeit und Geld notwendig ist, um eine Software stabil zu machen, sondern auch Entwicklergeist und Können und das haben die Entwickler von Doctrine auf jeden Fall schon recht früh bewiesen. Ich kann aus eigener Erfahrung sagen, dass das Entwickeln mit Doctrine zwar ab und an doch noch einiges an Nerven kostet, aber dann, wenn man durchgestiegen ist, doch recht viel Freude macht.

Schauen wir mal wie es weiter geht ;)

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , , , ,

Aug 14

Achtung:
Dieses Turorial bezieht sich auf eine veraltete Version von Doctrine und funktioniert vermutlich mit den neueren 1.x und späteren 2.x Releasen nicht mehr.

Nachdem wir uns im letzten Beitrag nochmal mit dem Beziehungen der Datenbanktabellen und Klassen beschäftigt haben, wollen uns heute einem weiteren Kapitel widmen, den Event-Listenern.

Sie sind ein einfaches Instrument, die auch bei vielen DBMS durch Trigger abgebildet sind. Ein praktisches Beispiel schauen wir uns nun einmal an. Wir haben ja eine Produkt-Tabelle und Klasse, hier wollen wir nun eine User-Id speichern, damit wir wissen, welcher User ein Produkt angelegt hat. Zusätzlich möchten wir einen aggregierten Counter für jeden User haben, damit wir nicht bei jedem Request seines Profils alle Produkte summieren müssen, um herrauszufinden, wie viele Produkte ein User angelegt hat. Dies soll natürlich nicht explizit geschehen müssen. Wir möchten, dass einem User automatisch ein Produkt “gutgeschrieben” wird, sobald er es anlegt, und es abgezogen wird, wenn er das Produkt löscht.

Hierzu legen wir ein Feld “product_count” an, welches beim User selbst abgelegt wird. Beginnen wir nun mit dem Anlegen der User-Klasse und Datenbank-Tabelle: Continue reading »

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , , ,

Aug 02

Achtung:
Dieses Turorial bezieht sich auf eine veraltete Version von Doctrine und funktioniert vermutlich mit den neueren 1.x und späteren 2.x Releasen nicht mehr.

Nachdem im letzten Beitrag das Thema 1:n Beziehungen beleuchtet haben, wenden wir uns nun der letzten Beziehungsart zu, die man mit einer Datenbankrelation abbilden kann, nämlich der n:m Beziehung.
Als Basis dazu nehmen wir die Klassen und Datenbanktabellen, die wir in den letzten beiden Artikeln erstellt haben und tauchen nun wieder in die Anwendung ein. Wir möchten nun festhalten, dass die verschiedenen Variationen (Light, Zero) eines Produkts (Coca Cola) in verschiedenen Handelsunternehmen (POS = Point of Sale) verkauft werden.
Dies lässt sich ja auf Datenbankebene mit einer Verknüpfungstabelle darstellen, die die beiden Fremdschlüssel von den Jeweiligen Entitäten enthält und diese so mit einander verknüpft. Auf diese Weise können beliebige Kombinationen in beliebiger Anzahl dargestellt werden. Als Schutz vor Doppeleinträgen machen wir aus dem Datensatz in der Verknüpfungstabelle einen kombinierten Primärschlüssel, sodass hier Datenbankseitig bereits vor Doppeleinträgen geschützt wird. Doctrine reagiert beim Versuch einen Doppeleintrag anzulegen mit einer Exception, die von PDO geworfen wird.

Steigen wir aber nun in die Entwicklung der Doctrine Klassen ein. Continue reading »

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , ,

Jul 30

Achtung:
Dieses Turorial bezieht sich auf eine veraltete Version von Doctrine und funktioniert vermutlich mit den neueren 1.x und späteren 2.x Releasen nicht mehr.

Nach dem wir im letzten Beitrag die Grundlagen zu Doctrine gelernt haben, wollen wir heute ein wenig weiter in die Tiefe gehen.
Wir nehmen wieder unser Beispiel und nehmen an wir haben ein Produkt z.B. Coca Cola. Hierzu gibt es viele Varianten wie z.B. Zero, Light, Cherry. Diese wollen wir speichern und dabei das Original- bzw. Basisprodukt nur einmal speichern. Dies ist eine 1:n Beziehung, die wir in Doctrine abbilden möchten.
Der Grundaufbau der Includes etc. ist genau der selbe, wie wir ihn beim letzten Mal verwendet haben, daher will ich diesen nicht mehr erläutern. Continue reading »

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , ,

Jul 24

Achtung:
Dieses Turorial bezieht sich auf eine veraltete Version von Doctrine und funktioniert vermutlich mit den neueren 1.x und späteren 2.x Releasen nicht mehr.

Heute starte ich meine Serie zum Thema ORM in PHP mit Doctrine.
Durch ORM ermöglicht man dem Programmierer den vollständigen objektorientierten Zugriff auf die Daten in der Datenbank und macht ihn somit unabhängig von der Speichern und verhindert somit auch die Verwendung von SQL. Das hat den Vorteil, dass man bei einem Wechsel des DBMS keine Querys anpassen muss (so denn das DBMS von dem ORM-Layer untersützt wird.

Doctrine ist eine in PHP5 programmierte Anwendung und ca. seit einem Jahr in Entwicklung. Da Doctrine dieses Jahr als Projekt bei Google Summer of Code antreten durfte, tut sich im Moment recht viel. Ich habe Doctrine seit der Revision 7xx verwendet und muss sagen, dass sich bis zur heutigen 2066 recht viel getan hat. Der erste Release-Candidate ist für Ende August angekündigt worden. Der Layer funktioniert großteils reibungslos, jedoch muss man bei Problemen auch hin und wieder mal in den Source schauen um zu verstehen, wieso etwas (noch) nicht funktioniert. Die Dokumentation ist zwar ausführlich, jedoch nicht so perfekt, als dass sie helfen könnte.

Heute machen wir einen kleinen Schnelleinstieg. Wir beginnen mit dem Aufbau der Db-Verbindung, Anlegen einer Doctrine-Db-Klasse, Einfügen von Datensätzen, Auslesen per Finder, Updaten, Auslesen per Query und Löschen. Die aktuellen Beispiele basieren auf der Revision 2066. Diese kann aus dem SVN-Repository von Doctrine ausgecheckt werden. Als Client verwende ich Tortoise SVN.
Continue reading »

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , ,