Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Trochę bardziej złożony JOIN
Forum PHP.pl > Forum > PHP > Frameworki
vonski
Moich problemów ze złączeniami w Symfony ciąg dalszy smile.gif

Mam takie tabele:

rider:
id
name

success:
id
rider_id
event_id
position

event:
id
compet_id

compet:
id
name

Tablea `rider` przechowuje dane o zawodnikach, `success` przechowuje dane o osiągnięciach poszczególnych zawodników, czyli jeden zawodnik może mieć kilka sukcesów, ale jeden sukces może być przypisany tylko do jednego zawodnika. Dalej - w `success` mamy jeszcze `event_id` - odwołuje się do pola `id` tabeli `event` - jest to tabela przechowująca dane poszczególnej imprezy sportowej. Na koniec mamy jeszcze `compet`, czyli tabelę przechowującą tak jakby kategorie rozgrywek (grand prix, mistrzostwa polski, europy itp.).
I teraz... chciałem zrobić takie złączenie żeby na podstawie `id` zawodnika zwracane były jego sukcesy, wraz z opisami imprez do których te sukcesy się odnoszą oraz z nazwami kategorii do których te imprezy przynależą.
Zapytanie SQL wyglądało by chyba mniej więcej tak:

  1. SELECT * FROM success INNER JOIN event ON (success.event_id = event.id) INNER JOIN compet ON (event.compet_id = compet.id) WHERE success.rider_id = '$jakieś_tam_id'


Czy może mnie ktoś naprowadzić mniej więcej jak się do tego zabrać? smile.gif
Dodam, że chcę, aby te informacje pokazywały się w widoku 'rider'. I generalnie problem jest taki, że w klasie 'RiderPeer' nie mogę się odwołać (chyba?) do klasy np. 'SuccessPeer'.
-=Peter=-
  1. $c = new Criteria();
  2. $c->addJoin(SuccessPeer::EVENT_ID, EventPeer::ID)
  3. ->addJoin(EventPeer::COMPET_ID, CompetPeer::ID)
  4. ->add(SuccessPeer::RIDER_ID, $id);
  5.  
  6. $results = SuccessPeer::doSelectXxx($c);

musisz napisać metodę doSelectXxx, która złoży z wyniku zapytania odpowiednią hierarchię klas, zobacz jak wygląda metoda doSelectJoinAll i zrób coś na ten wzór.
vonski
Działa, dzięki smile.gif tak to napisałem:

  1. static public function getSuccessById($id)
  2. {
  3. $c = new Criteria();
  4. $c->addJoin(self::EVENT_ID, EventPeer::ID, Criteria::LEFT_JOIN);
  5. $c->addJoin(EventPeer::COMPET_ID, CompetPeer::ID, Criteria::LEFT_JOIN);
  6. $c->add(self::RIDER_ID, $id, Criteria::EQUAL);
  7.  
  8. return SuccessPeer::doSelectJoinEvent($c);
  9. }


A najlepsze, że kilkadziesiąt minut mi to nie chciało działać - cały czas wyskakiwał mi błąd, że nie rozpoznaje w ogóle tych klas - SuccessPeer, EventPeer itd. A się okazało, że wystarczyło w linii poleceń napisać 'symfony cc' i dopiero później stworzyć model 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.