4 Stimmen

Aggregieren von Werten in Doctrine_RawSql-Abfragen

Ist es möglich, Aggregatwerte in Doctrine_RawSql-Abfragen zu verwenden? Hier ist, was ich zu tun versuche:

$q = new Doctrine_RawSql();
$q->select('{q.*}, AVG(a.value) AS avg');
$q->from('-- complex from clause');
$q->addComponent('q', 'Question');

Das von Doctrine erstellte SQL lässt jedoch nur Spalten aus der Tabelle question und lässt den Gesamtwert aus avg .

1 Stimmen

Versuchen Sie zunächst, eine Komponente für den Alias "a" hinzuzufügen (Sie haben "a.value" in der Abfrage).

0 Stimmen

Ich versuche, dasselbe zu erreichen, habe aber auch Schwierigkeiten. Haben Sie das Problem inzwischen behoben?

6voto

Steven Mercatante Punkte 23557

Ich habe noch nie Doctrine_RawSql verwendet, aber ich habe rohe SQL-Abfragen durch Doctrine mit einer dieser beiden Methoden durchgeführt:

Doctrine_Manager::getInstance()->getCurrentConnection()->fetchAssoc("YOUR SQL QUERY HERE");

und

$doctrine = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
$result = $doctrine->query('YOUR SQL QUERY HERE');

Es scheint, dass diese beiden Methoden Ihr ursprüngliches SQL intakt lassen würden.

Ich sollte anmerken, dass ich Doctrine 1.2 im Rahmen von Symfony 1.4-Anwendungen verwende, aber AFAIK würde dies für Sie unabhängig davon funktionieren, welche anderen Frameworks Sie möglicherweise verwenden.

0 Stimmen

Ich habe mich für die erste Lösung entschieden, da ich zwei Tabellen über einen Wert verknüpfen musste, der in der einen Tabelle vorhanden sein kann und in der anderen nicht, und zwar über einen LOJ. Aber ich hatte auch eine Where-Klausel und war mir nicht sicher, wie ich den Wert binden sollte. Man kann tatsächlich ein Array von Platzhaltern => Werten als 2. fetchAssoc etwa so fetchAssoc('SELECT * FROM user WHERE id = :userId'), array('userId' => $user->getId());

0voto

tobyodavies Punkte 24850

Haben Sie sich die Kochbuchabschnitt über Aggregate ? Sie verwenden createQuery Methode auf dem Entitätsmanager statt RawSql Objekte.

Ich bin kein Experte in Sachen Doktrin, aber das könnte ein guter Anfang sein!

0 Stimmen

Meine Frage bezieht sich auf Doctrine 1.x. Doctrine 2.0 ist eine ganz andere Geschichte.

0voto

Ludeks Punkte 480

Versuchen Sie, das Aggregatfeld in das SQL zu setzen und es dann mit geschweiften Klammern abzurufen. Ich verwende eine SQL-Subquery.

$q = new Doctrine_RawSql();
$q->select('{s.*}, {s.avg} AS avg');
$q->from('(SELECT q.*, AVG(value) AS avg FROM Question AS q) AS s');
$q->addComponent('s', 'Question');

Das funktioniert bei mir.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X