Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][doctrine]Pobranie tylko wybranych pol z joinowanej tabeli
Forum PHP.pl > Forum > PHP > Frameworki
nospor
Hejka,
w klasie repository mam taki kod:

  1. $query = $this->createQueryBuilder('s')
  2. ->leftJoin('s.user', 'u')->addSelect('u')
  3. ->orderBy('s.id', 'DESC')
  4. ->getQuery();

ktory to pobiera dane z tabeli s oraz JOINuje tabele u. Wszystko fajnie pieknie, tylko ten kod zwraca mi wszystkie pola z tabeli u a ja bym chcial pobrac tylko dwa pola z tabeli u.
Przegladam dokumentacje i wychodzi, ze za bardzo sie nie da.
Probowalem nawet tak
->addSelect(['u.pole1', 'u.pole2'])
ale to skolei pluje mi wyjatkiem
Cytat
Call to a member function getId() on array


Da sie to zrobic w tym queryBuilder czy musze inaczej budowac zapytanie?
Pyton_000
Dodawałeś u.ID do listy pól?

Ja w Laravel miałem to samo że jak robiłem JOIN i nie podawałem ID z jojnowanej tabeli to mi nie wczytywało relacji biggrin.gif

PS. I co to za nazwa tematu Panie Moderator. Przenoszę... A sorry nie mogę tongue.gif
nospor
Ale ja nie mam problemu ze mi nie pobiera. Ja mam problem ze mi pobiera wszystkie pola z tabeli U a chce pobrac tylko wybrane pola z tej tabeli

ps: tak sie skupilem na tagach ze zapomnialem o tytule sad.gif
Pyton_000
a

Kod
        $query = $this->createQueryBuilder('s')
            ->select(['u.id', 's.id', 'u.pole1'])
            ->leftJoin('s.user', 'u')
            ->orderBy('s.id', 'DESC')
            ->getQuery();
nospor
NIe, juz tego tez probowalem. Wszelkie proby wsadzenia tablicy w jakikolwiek SELECT powoduje rzucanie bledem
"Call to a member function getId() on array "
starach
To niestety chyba pozostaje Ci tylko DQL

Możesz jeszcze spróbować:
  1. $query = $this->createQueryBuilder()
  2. ->select(['u.id', 's.id', 'u.pole1'])
  3. ->from('Bundle:Entity', 's')
  4. ->leftJoin('s.user', 'u')
  5. ->orderBy('s.id', 'DESC')
  6. ->getQuery();
nospor
Cytat
Możesz jeszcze spróbować:
Tak tez probowalem wczesniej i niestety dalej to samo.

Tak tez myslalem ze pozostaje mi tylko DQL. No nic, poki co to nie problem bo narazie dzialam na malych tabelach, ale pozniej dojda tabele z wiekszymi danymi i trzeba bedzie sie przestawic dla nich.
Turson
Używając select() rezultatem zapytania jest tablica. Stwórz z niej obiekt(y), albo użyj partial w select
nospor
@Turson nic z tego co powiedziales nie zrozumialem. Co masz na mysli piszac " rezultatem zapytania jest tablica i zrob z niej obiekty" ?
Turson
To query z posta #1 zwraca tablicę dlatego dostajesz "Call to a member function getId() on array". Możesz z takiej tablicy zrobić obiekt (zapewne encję) samemu
nospor
hm... Ok, to jest jakis trop. Porownam co jest zwracana gdy jest ok z tym co jest zwracane gdy nie jest ok i dam znac

edit:
@Turson dzieki, miales rzecz jasna racje.
Normalnie mialem obiekt entity S a w nim jego pola oraz enity U.
W momencie gdy dodawalem tylko wybrane pola dla U, mialem tablice o indexach:

0 - i tu normalnie po staremu obiekt enity S
id - tu id z tabeli U
username - tu username z tabeli U

Czyli mialem tablice z indexem 0 gdzie byl normalnie entity S oraz dodatkowe indexy na pola ktore wybralem z U. Lekko zakrecone smile.gif
Pilsener
Zgadza się, użycie nazw kolumn zmienia sposób hydrowania bazy, znalazłem u mnie np. coś takiego:

  1. $query = $this->getDoctrine()->getRepository('MyBundle:Application')->createQueryBuilder('a');
  2.  
  3. $fields = ['b.id AS col1', 'b.name AS col2', 'c.name AS col3'];
  4. $query
  5. ->select($fields)
  6. ->from('MyBundle:Application', 'b')
  7. ->leftjoin('b.customer', 'c');
  8. ;
  9. $results = $query->getQuery()->getResult();
  10. Debug::dump($results);


Działa bez zarzutu.
Rozumiem, że problemem jest wydajność, inaczej nikomu obiekty by nie przeszkadzały.
nospor
Cytat
Rozumiem, że problemem jest wydajność, inaczej nikomu obiekty by nie przeszkadzały.
Tylko najlepsze jest to, ze w moim przypadku on nadal tworzy obiekty, tylko ukrywa je pod indexem 0 (zero) a obok tego indexu dodaje indexy z polami z innych pol. A pod indexem 0 nadal jest pelnoprawny obiekt.

ps: a konkretnie tworzy obiekt S gdy podam 's'. gdy wyszczegolnie pola z s np 's.id' to juz leci w calosci tablica. Dobrze wiedziec smile.gif
maly_swd
  1. $qb->select('partial p.{id, sign, name}, c')
  2. ->from('encja', 'p')
  3. ->leftJoin('p.innaencja', 'c')
  4. ->getQuery();
  5.  
  6.  
  7.  
  8.  
nospor
@maly_swd, dzieki, perfect biggrin.gif Wszakze Turson tez o tym mowil, ale ze jeszcze jestem poczatkujacy w Symfony/doctrine to za bardzo nie zrozumialem.
maly_swd
Z tego co pamiętam, to uważaj jak robisz Partiala.
Jeśli odwołasz się do getera którego nie podałeś w partialu to dostaniesz NULL (mimo, że w bazie masz tam jakąś wartość).
Problemy mogą być gdy zaczniesz utrwalać zmiany na takich obiektach. - Ale to sam się przekonasz.

Pozdr.
nospor
Akurat tego mam zamiar uzywac tylko i wylacznie przy SELECT przy generowaniu stronicowanego GRIDa wiec nie bede nic utrwalal smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.