Hallo,
irgendwie verzweifle ich gerade an der einfachste Aufgabenstellung: Ich möchte mir Datensätze nach einer bestimmten Spalte sortieren lassen und habe dazu die findAll-Methode überschrieben:
public function findAll() {
$query = $this->createQuery();
$query->setOrderings (Array('postcode' => Tx_Extbase_Persistence_Query::ORDER_ASCENDING));
return $query->execute();
}
Sortiert wird aber nichts, die Sortierung erfolgt einfach nach der UID. Die Spalte nach der sortiert werden soll heißt eben "postcode" in der Datenbank. Danke für Eure Hilfe!
LG
Christoph
Hallo Christoph,
ich habe Dein PHP-Code angeschaut, konnte nicht auffälliges sehen. Aber wie sieht es denn mit dem vom Extbase zusammengebastelten SQL-Statement aus? Kennst Du ihn?
Wenn nicht, dann kannst Du den im Log des Mysqlservers nachschauen. Und zwar im Log für Anfragen.
Aktivierbar mit der Directive log. Standardmäßig wird mysqld.log ins Datenverzeichnis %datadir% reingeschrieben (Ermittg des Datenverzeichnis z.B. mit SQL: show variables like 'datadir' ).
Gruß
Wolfram
Hallo Wolfram,
danke für den Tipp. Leider habe ich aber keinen Zugriff auf die Log-Dateien, da das ganze ein Kundenprojekt ist und der Kunde einen normalen Webhost-Account hat.
Ich habe jetzt testweise die Abfrage umgestellt und wie folgt gemacht:
public function findAllActive() {
$query = $this->createQuery();
$query->statement('SELECT * FROM tx_immobilia_domain_model_object ORDER BY postcode');
$objects = $query->execute();
return $objects;
}
Dann funktioniert das ganze, nur möchte ich ja die versteckten Elemente nicht anzeigen. Daher habe ich das SQL-Statement geändert auf:
SELECT * FROM tx_immobilia_domain_model_object WHERE hidden = 0 ORDER BY postcode
Nur dann funktioniert es wieder nicht. Die Sortierung wird einfach ignoriert, sobald ich die WHERE-Klausel verwende? Schon komisch, oder? :-)
Danke
Christoph
Hallo Christoph,
wenn das ein ganz normaler Webhost-Account ist, dann mache ein File- und SQL-Dump zieh Dir bei Dir selbst eine Entwicklungsumgebung hoch.
Bei Deinen SQL-Statements kann nichts fehlerhaftes sehen. Ich meine, damit kannst Du mit MySQL-Workbench oder mit phpmyadmin die Query ohne Fehler ausführen.
Was mich bei der statement-Methode mich stutzig macht, ist der 2. Parameter. Er ist optional, daher
geht ein
SELECT * FROM tx_immobilia_domain_model_object ORDER BY postcode
aber ein geht steht für mich nicht felsenfest.
SELECT * FROM tx_immobilia_domain_model_object WHERE hidden = 0 ORDER BY postcode
1. hidden ist ein Systemfeld
siehe Buch Zukunftssichere TYPO3-Extensions mit Extbase und Fluid Seite 157:
http://books.google.de/books?id=qihZuW_rk5oC&pg=PA157&dq=typo3+createQuery+statement%28&hl=de&ei=5bU0TcbHI8bEswaK69WFCg&sa=X&oi=book_result&ct=result&resnum=1&sqi=2&ved=0CCwQ6AEwAA#v=onepage&q=typo3%20createQuery%20statement%28&f=false
Methode setRespectsEnableFields() steuert die verwendet von hidden=0 im Sqlstatement.
2. Der 2. optionale Parameter
Ich weiss nicht, ob man die WHERE Klausel im 1. Parameter angeben darf. Möglicherweise nicht, und man muss die WHERE Klausel im 2. Parameter angeben: array('hidden' => 0)
Beschreibung der Methode Tx_Extbase_Persistence_Query::statement():
http://www.t3node.com/typo3api/trunk/d8/d31/classTx__Extbase__Persistence__Query.html#aa2adc619053d02d23bb29c7755b35a22
Gruß
Wolfram
Hallo Christoph
Der Code in deinem ersten Post ist eigentlich korrekt. Kannst du uns mal dein Model zeigen? Bzw. hast du der Property den richtigen Datentyp zugewiesen?
Gruss René
Hallo!
Warum auch immer: Ich habe alle möglichen Tipps von hier und was ich sonst noch so gefunden habe probiert, leider ohne Erfolg. Ich habe es daher etwas unschön gelöst, indem ich mir das hidden-Field in das Objekt geholt habe und dann in Fluid abfrage, ob es 0 oder 1 ist:
<f:if condition="{object.hidden} == 0">
Schön ist es nicht, da aber nicht allzu viele Objekte erstellt werden, tut es auch diese Lösung fürs Erste.
LG
Christoph