[Quicktip] Symfony2 / Doctrine Schema Update funktioniert nicht und liefert keine Ausgabe

Die Logging Mechanismen von Symfony2 sind manchmal nicht ganz durchschaubar: wenn irgendwas in den Entities nicht stimmt, kann es sein, dass die Schema Validierung oder auch das Schema Update beim Aufruf des entsprechenden Konsolenkommandos kommentarlos beendet werden. In diesem Fall prüft intensiv, dass die Namespaces und auch die Annotations innerhalb der Entities sowie den Repositories korrekt sind!

[Symfony2] Wie kann man bei einem Repository findAll eine Sortierung setzen?

Mit den Magic Methoden der Symfony Repositories kann bekommt man automatisch Methoden wie findBy[Feldname] oder findAll bereitgestellt. Mit dabei ist jedoch keine direkte Möglichkeit, die Ergebnisse bereits zu sortieren. Über einen kleinen Trick geht aber auch das:

Möchte man ein findAll umsetzen, sieht der Code so aus:

$repository->findBy(array(), array('name' => 'asc'));

Jetzt werden alle Entities für dieses Repository geladen, jedoch erfolgt die entsprechende Query mit einem “ORDER BY name ASC”. Möchte man das findAll in eine spezifizierte Suche umwandeln, muss man das erste Array einfach mit dem gewünschten Feldnamen und dem zu suchenden Wert befüllen:

$repository->findBy(array('active' => 1), array('name' => 'asc'));

[php] Oracle XE und Doctrine/Symfony funktioniert nicht

Kurzer Warnhinweis: ich bin kein Freund von Oracle und finde es zumindest im Bezug auf php relativ kompliziert in der Einrichtung. Dieser Artikel besteht daher zum Teil aus gefährlichem Halbwissen – falls ich also Blödsinn erzähle, korrigiert mich bitte per Kommentar oder Mail 😉

Wenn ihr ein Symfony 2 Projekt mit einer Oracle XE Datenbank verbindet und dann folgende Fehler auftauchen – z.B. bei einem app/console doctrine:schema:create :

[Doctrine\ORM\Tools\ToolsException]
Schema-Tool failed with Error '' while executing DDL: CREATE TABLE Foo (id NUMBER(10) NOT NULL, name VARCHAR2(100) NOT NULL, PRIMARY KEY(id))
[Doctrine\DBAL\Driver\OCI8\OCI8Exception]

Dann müsst ihr folgende Dinge richtig machen:

Eure Konfiguration sollte so aussehen:

parameters:
    database_driver:   oci8
    database_host:     localhost
    database_port:     1521
    database_name:     xe
    database_user:     dbuser
    database_password: dbpass

Beim Treiber könnte man auch pdo_oci verwenden – was auch in vielen Tutorials empfohlen wird. Das Problem ist jedoch, dass dieser Treiber sehr instabil ist. Daher einfach oci8 verwenden 😉

Hostname und Port sollten klar sein, der Datenbankname ist bei einem Oracle XE grundsätzlich “xe”. Was ihr dann innerhalb eures Oracle Clients seht, was sich ähnlich wie eine DB in MySQL anfühlt, ist in der Oracle Sprachwelt ein Schema. Das Schema ist in der Regel gleich dem DB-Nutzernamen.

So, dass zu den Einstellungen. Der fiese Part, durch den es zum oben genannten Fehler kommen kann, ist, dass man noch zwei Umgebungsvariablen auf der Shell und im Apachen setzen muss, damit die Verbindung von Symfony zu Oracle korrekt läuft:

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export LD_LIBRARY_PATH=/usr/local/lib

Diese beiden Zeilen (natürlich mit den jeweils korrekten Pfaden für euer System) packt ihr entweder in die .bashrc des jeweiligen Users oder in die envvars Datei vom Apachen (diese Angaben beziehen sich primär auf ein Standard Debian, wie es in anderen Distributionen aussieht weiß ich nicht!).

Falls ihr die Variablen für den Apachen setzen müsst, nicht vergessen, diesen mittels Neustart dazu zu bewegen, diese auch zu laden 😉

Nun sollte die Verbindung laufen.

[FLOW3] Wie kann man mittels Repository eine einfache Count Abfrage durchführen?

Der ORM Teil von FLOW3 besteht leider (zumindest für erfahrene Entwickler) aus sehr viel Magic, die man nicht immer so leicht durchschauen kann. So ist es eigentlich selten nötig, irgendeine Methode im Repository zu implementieren. Rein durch das Erben der Basisklasse “\TYPO3\FLOW3\Persistence\Repository” erhält man die magischen findBy*() und findAll() Methoden, mit denen man so gut wie alle notwendigen Abfragen abdeckt. Nicht so wirklich bekannt sind jedoch die parallel dazu verfügbaren countBy*() und countAll() Methoden, mit denen man allerdings keine Datenobjekte abfragt, sondern eben die Anzahl der möglichen Datensätze als Ergebnis bekommt.

Beispiel:

$userFromDresdenCount = $userRepo->countByWohnort('Dresden');

oder

$userCount = $userRepo->countAll();