2012-11-24 6 views
18

Ab Dokumentin 2.1 wird die CASE WHEN-Anweisung unterstützt, aber es gibt nicht viel Dokumentation darüber. Mein Ziel ist es, einen Booleschen Wert gesetzt zu sagen, ob ein Foto von einem Benutzer favorisiert wurde:Speichern der "CASE WHEN" -Bedingung in Doctrine2-Entität

 ->addSelect("CASE WHEN f.photo is NULL THEN false ELSE true END as is_favorited") 
     ->leftJoin("p.favorites", 'f', 'WITH', 'f.owner = :viewer') 
     ->orderBy("p.date_posted", "DESC") 
     ->setParameters(array("owner" => $owner, "viewer" => $viewer)); 

Aber weil meine Entitäten in json von JMSSerializer transformiert werden, würde Ich mag die CASE setzen, wenn das Ergebnis als Eigenschaft auf der Entität.

 ->addSelect("CASE WHEN f.photo is NULL THEN false ELSE true END as p.is_favorited") 

aber sich leider Lehre scheint nicht das mögen:

[Syntax Error] line 0, col 65: Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got '.'

Gibt es eine Alternative zum Einstellen DQL Eigenschaften für eine Entität erstellt?

+0

Ist das Ergebnis gesetzt Kartierungsarbeiten mit DQL? – gremo

+0

Würde '-> addSelect ('f.photo IS NOT NULL')' nicht den gleichen Effekt haben (aber vielleicht nicht Doctrine stolpern)? –

+0

Haben Sie versucht, einfach das 'CASE' in'() 'wie 'zu kapseln (CASE WENN f.photo NULL DANN falsch ist ELSE wahr END) wie is_favorited'? – prodigitalson

Antwort

2

Es gibt keine Möglichkeit, den Eigenschaftswert in der Abfrage direkt festzulegen. Stattdessen können Sie ein nicht zugeordnetes Feld zu einer Entität hinzufügen und dann die Ergebnisse durchgehen und festlegen. In diesem Fall JMSSerializer serialisieren Sie dieses Feld und Sie können erforderlichen Typ und andere Metainformationen darauf festlegen.

0

Können Sie das versuchen. es wird

->addSelect("SUM(CASE WHEN f.photo is NULL THEN 0 ELSE 1 END) as p.is_favorited"); 
+0

Ich habe nicht mehr das Setup, das anfänglich diese Frage erstellt, aber das kann eine lohnende Lösung sein. Funktioniert es tatsächlich? – Dandy

-1

Aus dem Fehler mit DQL arbeiten, es klingt wie es beschwert hat, weil Sie nicht FROM Tabelle in der select-Anweisung aufgeführt haben.

+0

Wenn Sie Abfragen direkt aus einem Repository erstellen, müssen Sie das "from()" nicht angeben, da Doctrine das automatisch für Sie füllt. Beispiel: "$ repository-> createQueryBuilder ('p')" – Dandy

-1

Sie müssen nur Ihre

->from() 

Zeile hinzufügen, die den Tabellennamen für „F“ gibt und

+0

Wenn Sie Abfragen direkt aus einem Repository erstellen, müssen Sie nicht "from()" angeben, da Doctrine diese automatisch für Sie füllt. – Dandy

Verwandte Themen