Doctrine subquery Error: Expected =, <, <=, <>, >, >=, !=, got 'LIKE'

0

Cześć - napotkałem problem w doctrine którego nie potrafię rozwiązać.
Chcę przenieść następujące zapytanie na poziom doctrina:

 SELECT count(c.id) FROM company c WHERE (SELECT MIN(u.surname) FROM contact u WHERE u.company_id = c.id) LIKE '%a%'

Takie zapytanie w sql-u ładnie działa i zwraca to co trzeba.

Tak wygląda to co stworzyłem po stronie php i doctrina:

$this->getDoctrine()->getManager()
            ->getRepository('XYZBundle:Company')
            ->createQueryBuilder('c')
            ->select('COUNT(c.id)')
            ->where("(SELECT MIN(u.surname) FROM XYZBundle:Contact u where u.id = c.id) LIKE '%a%'")
            ->getQuery()
            ->getResult();

i niestety ale taka konstrukcja zrzuca QueryException: [Syntax Error] line 0, col 136: Error: Expected =, <, <=, <>, >, >=, !=, got 'LIKE' ' jeśli zamienię LIKE na = to wszystko działa mnie jednak interesuje LIKE - czy ktoś wie co jest nie tak z taką konstrukcją w DQL ?

0

Luźna myśl: spróbuj bindować (tak, wiem, że to jest stała) albo buduj całe zapytanie za pomocą query buildera.

0

Niestety ale nic to nie daje.

0

Troszkę dziwne jest to zapytanie - co ono robi? Zwraca ilość rekordów z najkrótszym wyrazem, z najmniejszą wagą liter, który zawiera literę a ?

Ale to na początek - poza tym
http://www.doctrine-project.org/api/orm/2.5/source-class-Doctrine.ORM.Query.Expr.html#501-512
i tym
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html

0

Zapytanie zwraca ilość rekordów takich gdzie nazwisko najmniejsze alfabetycznie zawiera literę "a". I zapytanie napisane w mysql-u działa poprawnie i zwraca to czego potrzebuję. Niestety napisane w DQL zrzuca wyjątek - ale gdy zmienię tego like na = to wtedy działa ok. I niestety nie jestem w stanie zrozumieć dlaczego tak się dzieje skoro zapytanie jest poprawne

0

A czy próbowałeś osiągnąć to za pomocą metody like() z klasy Doctrine\ORM\Query\Expr?

0

Tak tak próbowałem generować to podzapytanie jako z osobnego queryBuildera i nie pisać go z "palca" tylko odpowiednimi metodami typu like itp i potem getDQL pobierałem jego treść - wygenerowana treść jest identyczna jak moje podzapytanie.

0

Spróbuj zamiast '%a%' dać samo %a%. Wydaje mi się, że nie jest to potrzebne w query builderze.

0

Tak jak pisał @Patryk27, spróbuj bindować parametr.

$letter = 'a';
$qb
    ->where("(SELECT MIN(u.surname) FROM XYZBundle:Contact u where u.id = c.id) LIKE :letter")
    ->setParameter('letter', %.$letter.%)
;

Też raz miałem podobny przypadek. Po napisaniu zapytania w analogiczny sposób zapytanie działało jak należy. Ja nie miałem akurat podzapytania.
Ogólne spostrzeżenie jest takie, że podzapytań nie wstawia się w ten sposób do query buildera. ;)
Musisz zrobić drugie zapytanie jako osobny $qb i tu przekazać DQL'a. Rozwiązania są w sieci.

0

Niestety ale okazuje się że DQL nie wspiera takiej składni - czyli pisząc podzapytanie z LIKE nie jest możliwe w DQL - należy użyć raw SQL :(

0

Wiecz co, sprawdziłem właśnie dokumentację Doctrine 2 dla DQL'a. Sam pamiętam, że używałem LIKE w DQL i miałem rację. Podaję link do dokumentacji, wyszukaj podrozdział "14.5.4. Other Expressions".
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

Przykładowe zapytanie za pomocą DQL z like:

SELECT u 
FROM Entities\User u 
LEFT JOIN u.articles a 
WITH 
   a.topic LIKE '%port%' 
0

Owszem da się napisać zapytanie z LIKE ale nie podzapytanie - takiej konstrukcji DQL nie wspiera

0

Nie wiem skąd takie ograniczenie - dla mnie to jakaś tragedia... musiałem pisać native SQL - najgorsze, że wtedy trzeba pisać wszystko "z palca" bo query builder tworzy dql-a... jakaś masakra...

1 użytkowników online, w tym zalogowanych: 0, gości: 1