2012-11-24 10 views
18

Od wersji Doctrine 2.1 instrukcja CASE WHEN jest obsługiwana, ale nie ma na niej zbyt wiele dokumentacji. Moim celem jest, aby ustawić wartość logiczną, aby stwierdzić, czy zdjęcie zostało ulubionych przez użytkownika:Przechowywanie warunku "CASE WHEN" w jednostce Doctrine2

 ->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)); 

Ale ponieważ moje podmioty są przekształcone json przez JMSSerializer chciałbym ustawić w przypadku, gdy wynik jako własność na podmiocie.

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

Ale unforunately Doctrine nie wydaje się słuszne:

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

Czy istnieje alternatywa do ustawiania DQL stworzony właściwości na podmiot?

+0

powoduje ustawienie pracy mapowania z DQL? – gremo

+0

Czy '-> addSelect ('f.photo IS NOT NULL')' nie wywoła takiego samego efektu (ale być może nie potknie się o Doctrine)? –

+0

Czy próbowałeś po prostu enkapsulacji 'CASE' w'() 'like' (CASE WHEN f.photo jest NULL THEN false ELSE true END) jak is_favorited'? – prodigitalson

Odpowiedz

2

Nie ma możliwości bezpośredniego ustawienia wartości właściwości w zapytaniu. Zamiast tego możesz dodać niezapisane pole do encji, a następnie przejrzeć wyniki i je ustawić. W takim przypadku JMSSerializer serializuje to pole i można ustawić na nim niezbędny typ i inne informacje meta.

0

Możesz spróbować tego. to będzie działać z DQL

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

Nie mam już instalacji, która początkowo stworzyła to pytanie, ale może to być warte rozwiązania. Czy to rzeczywiście działa? – Dandy

-1

Z błędu brzmi jak to skarży, bo nie masz FROM tabeli wymienionej w instrukcji wyboru.

+0

Podczas tworzenia kwerend bezpośrednio z repozytorium nie trzeba określać "od()", ponieważ Doctrine automatycznie je zapełni. Np. "$ Repozytorium-> createQueryBuilder (" p ")" – Dandy

-1

Trzeba tylko dodać linię

->from() 

który daje nazwę tabeli na „F” i

+0

Podczas tworzenia kwerend bezpośrednio z repozytorium nie trzeba określać "od()", ponieważ Doctrine automatycznie je zapełni. – Dandy

Powiązane problemy