• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Doctrine - problem z QueryBuilder

Object Storage Arubacloud
0 głosów
413 wizyt
pytanie zadane 21 października 2017 w PHP przez Assasz Nałogowiec (30,460 p.)

Witam.

Mam następującą sytuację: posiadam encję User powiązaną relacją 1-n z encją Post. Teraz chcę wylistować danych użytkowników posortowanych według pewnych kryteriów - jednym z tych kryteriów jest liczba postów danego użytkownika. W SQL'u wyglądałoby to dokładnie tak (działa idealnie):

SELECT user.*, COUNT(post.id) AS posts 
FROM user LEFT JOIN post ON user.id = post.author_id 
GROUP BY user.id ORDER BY posts DESC

Mój QueryBuilder wygląda natomiast tak:

$query = $this->createQueryBuilder('u')
            ->Where('u.username LIKE :input')
            ->orWhere('u.surname LIKE :input')
            ->orWhere('u.forename LIKE :input')
            ->setParameter('input', '%'.$input.'%');

if($sort == 'createDate')
{
        $query->orderBy('u.'.$sort, 'ASC');
}
else
{
        // jednym z wariantów $sort jest właśnie 'posts'
        $query->leftJoin('u.'.$sort, 'p')
              ->select('u, count(p.id) as '.$sort)
              ->groupBy('u.id')
              ->orderBy($sort, 'DESC');
}

return $query->getQuery();

Zapytanie zwracane przez metodę jest potem wykorzystywane przez paginator. Niestety, wywala mi błąd "Key "id" for array with keys "0, posts" does not exist." w następującym miejscu mojego widoku (przed dodaniem nowych kryteriów sortowania - innych niż 'createDate' - działało):

<a href="{{ path('user', {'user': user.id}) }}">

Moje pytanie: jak poprawnie skonstruować takiego QueryBuildera? Byłbym wdzięczny za pomoc.

1 odpowiedź

0 głosów
odpowiedź 22 października 2017 przez Assasz Nałogowiec (30,460 p.)

Dopiero teraz zajrzałem w logi i znalazłem tam takie zapytanie, jakie wykonuje Doctrine:

SELECT u0_.username AS username_0, u0_.username_canonical AS username_canonical_1, 
u0_.email AS email_2, u0_.email_canonical AS email_canonical_3, 
u0_.enabled AS enabled_4, u0_.salt AS salt_5, u0_.password AS password_6, 
u0_.last_login AS last_login_7, u0_.confirmation_token AS confirmation_token_8, 
u0_.password_requested_at AS password_requested_at_9, u0_.roles AS roles_10, 
u0_.id AS id_11, u0_.last_edited AS last_edited_12, u0_.surname AS surname_13, 
u0_.forename AS forename_14, u0_.profile_picture_path AS profile_picture_path_15, 
u0_.create_date AS create_date_16, count(p1_.id) AS sclr_17 
FROM `user` u0_ LEFT JOIN post p1_ ON u0_.id = p1_.author_id 
WHERE (u0_.username LIKE ? OR u0_.surname LIKE ? OR u0_.forename LIKE ?) 
AND u0_.id IN (?) GROUP BY u0_.id ORDER BY sclr_17 DESC

No i błąd tkwi w tym konkretnie fragmencie:

AND u0_.id IN (?)

Jakim cudem się to tam znalazło, skoro nic takiego nie definiowałem, i najważniejsze, jak się tego pozbyć?

Podobne pytania

0 głosów
0 odpowiedzi 132 wizyt
pytanie zadane 9 maja 2017 w SQL, bazy danych przez Garrs Początkujący (320 p.)
0 głosów
0 odpowiedzi 156 wizyt
pytanie zadane 10 maja 2020 w PHP przez XiverKi Bywalec (2,050 p.)
0 głosów
1 odpowiedź 536 wizyt
pytanie zadane 5 kwietnia 2020 w PHP przez Assasz Nałogowiec (30,460 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...