Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ Symfony Doctrine - zamiana wyniku zapytania na encje

Napisany przez: marekm10 20.06.2019, 10:46:51

Cześć
piszę sobie coś w Symfony 4 z Doctrine i mam taką sytuację, że optymalniej wydaje mi się napisać zapytanie samemu przy użyciu query buildera, niż zdać się na automatyczne wyciąganie. Są dwie encje, które trzeba połączyć po to, aby wyjąć dane z 3 tabeli - w sumie to nieistotne teraz. Mam klasę repozytorium encji i w jednej z metod kod:

  1. $this->createQueryBuilder('u')
  2. ....
  3. ->select('u.id')
  4. ->getQuery()
  5. ->getResult();


Moje pytanie jest takie: jak zamienić wynik tego zapytania na encję? Otrzymuję na ten moment zwykłą tablicę z id, a chciałbym dostać tablicę (czy też kolekcję) encji z podstawionymi już wartościami pod odpowiednie pola (na razie jest to tylko id testowo, docelowo będzie więcej). Nie za bardzo wyobrażam sobie, aby trzeba było ręcznie robić pętlę, która po wszystkim przejdzie i przypisywać każdą wartość pojedynczo - pewnie można to zrobić lepiej. Szukałem, czytałem dokumentację Doctrine w sekcji o mappingu (nie wiem czy to to), ale nie mogę znaleźć tego, o co mi chodzi (albo źle szukam). Dotarłem do klasy typu ResultSetMappingBuilder, ale nawet nie wiem czy to jest od tego, a jak jest to gdzieś widziałem metody oczekujące czystego kodu SQL, a ja aż tak nisko schodzić nie potrzebuję, query builder mi wystarczy.

Proszę o pomoc i poradę pod jakimi hasłami tego szukać, gdzie szukać albo ewentualnie o jakiś przykładowy kod.

Napisany przez: ohm 20.06.2019, 11:49:47

Hm, a co z ->select("u") ?

Napisany przez: marekm10 20.06.2019, 12:27:31

Ok, jest to jakis krok, nie sądziłem, że to aż tak proste. Z tym że nie rozwiązuje do końca mojego problemu, bo w drugim zapytaniu mam jeszcze joina i tam potrzebuję wybrać to co jest pod relacją jako encję tej relacji.

  1. this->createQueryBuilder('om')
  2. ->join('om.user', 'u', http://www.php.net/join::WITH, 'om.u_id = 5')
  3. ->select('u')
  4. ->getQuery()
  5. ->getResult();


Teraz chcąc zrobić select('om') jest ok, zwraca encje od om. Ale gdy chcę zrobić select('om.user') wtedy dostaję błąd:
> Error: Invalid PathExpression. Must be a StateFieldPathExpression

A gdy próbuję samo select('u')
> Error: Cannot select entity through identification variables without choosing at least one root entity alias.

jak sobie z tym poradzić?

Napisany przez: ohm 20.06.2019, 13:28:31

powinno pomoc select('om, u'),

Napisany przez: marekm10 20.06.2019, 16:59:19

Faktycznie, zadziałało, z tym że niepotrzebnie dodatkowo wyciąga wtedy dane om, robi ich tablicę i dopiero na każdym om trzeba wywołać metodę, aby dostać u. O tyle dobrze, że wszystko idzie w jednym zapytaniu.
Znalazłem przed chwilą jeszcze radę, aby dodać drugą encję jako ->from('encja', 'u') + odpowiedni warunek łączący jak przy joinie i wtedy w select można dać samo 'u' i działa.
Dzięki za pomoc

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)