Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony] pobieranie danych z 2 tabel
Forum PHP.pl > Forum > PHP > Frameworki
phpion
Hejka,
mam problem i nie bardzo wiem jak to ugryźć.
Otóż: mam tabelę:
  1. ogloszenia (id, kategoria, tytul...)

i jest to tabela macierzysta. Część podkategorii ma rozszerzoną tą tabelę o inną np.
  1. samochody (id_ogloszenia, marka, model...)

lub też
  1. mieszkania (id_ogloszenia, powierzchnia, pietro...)

Na stronie głównej pobieram dane tylko z tabeli macierzystej (tj. 'ogloszenia), natomiast przy wejściu w odpowiednią kategorię chciałbym do standardowych danych dodać te charakterystyczne dla danej kategorii. Jak się do tego zabrać? Czy po prostu osobne klasy dla każdego typu ogłoszenia, a w nich metoda getData() pobierająca dane zapytaniem wpisanym ręcznie. Tak bym zrobił standardowo ale jak to zrobić poprawnie w Symfony?
defrag
Propel dla kazdej tabeli robi model. Wiec przy wejsci w do kategorii mozesz zrobic joina. Dla zwyklego innera sprawa jest prosta bo robisz w Peerze ::doSelectJoinAll, natomiast dla LEFT sprawa sie troche komplikuje:
Przyklad
  1. <?php
  2. public static function doSelectUserWithPersonal(Criteria $c, $con = null)
  3. {
  4. $c = clone $c;
  5. $c->clearSelectColumns();
  6. $c->setLimit(1);
  7.  
  8. UserPeer::addSelectColumns($c);
  9. UserPersonalPeer::addSelectColumns($c);
  10. $c->addJoin(UserPeer::USER_PERSONAL_ID, UserPersonalPeer::ID , Criteria::LEFT_JOIN);
  11.  
  12. $rs = BasePeer::doSelect($c);
  13. $startcol2 = (UserPeer::NUM_COLUMNS - UserPeer::NUM_LAZY_LOAD_COLUMNS) + 1;
  14. $rs->next();
  15.  
  16. $omClass = UserPeer::getOMClass();
  17.  
  18. $cls = Propel::import($omClass);
  19. $obj1 = new $cls();
  20. $obj1->hydrate($rs);
  21.  
  22. $omClass = UserPersonalPeer::getOMClass();
  23.  
  24. $cls = Propel::import($omClass);
  25. $obj2 = new $cls();
  26. $obj2->hydrate($rs, $startcol2);
  27.  
  28. $obj1->setUserPersonal($obj2);
  29. return $obj1;
  30. }
  31. ?>
misiaczekmarek
witam,

nie będę zakładał nowego tematu bo problem jest pokrewny.

mam problem z wyswietleniem pola (NAZWA) z innej tablicy (Sl_Ulice).

w metodzie odpowiedzialnej za listowanie zawartoœci tablicy Sl_Adresy doda&sup3;em:
1) LEFT po odpowiednich polach obu tabel
2) pole NAZWA z tablicy Sl_Ulice

  1. <?php
  2. public function executeList()
  3. {
  4. $c = new Criteria();
  5. $c->clearSelectColumns();
  6. $c->addJoin(Sl_AdresyPeer::ID_ULICY, Sl_UlicePeer::ID_ULICY,Criteria::LEFT_JOIN);
  7.  
  8. $c->addSelectColumn(Sl_AdresyPeer::ID_ADRES);
  9. $c->addSelectColumn(Sl_AdresyPeer::ID_PREFIX);
  10. $c->addSelectColumn(Sl_AdresyPeer::ID_ULICY);
  11. $c->addSelectColumn(Sl_AdresyPeer::NUMER);
  12. $c->addSelectColumn(Sl_AdresyPeer::ID_KOD_POCZTOWY);
  13. $c->addSelectColumn(Sl_AdresyPeer::ID_ARKUSZ);
  14. $c->addSelectColumn(Sl_AdresyPeer::X);
  15. $c->addSelectColumn(Sl_AdresyPeer::Y);
  16. $c->addSelectColumn(Sl_UlicePeer::NAZWA);
  17.  
  18. $this->sl_adresys = Sl_AdresyPeer::doSelect($c);
  19. }
  20. ?>


zapytanie do bazy jest tworzone prawidłowo (fragment pliku log):

  1. SELECT sl_adresy.ID_ADRES, sl_adresy.ID_PREFIX, sl_adresy.ID_ULICY,
  2. sl_adresy.NUMER, sl_adresy.ID_KOD_POCZTOWY, sl_adresy.ID_ARKUSZ, sl_adresy.X,
  3. sl_adresy.Y, sl_ulice.NAZWA FROM sl_adresy LEFT JOIN sl_ulice ON
  4. (sl_adresy.ID_ULICY=sl_ulice.ID_ULICY)


i za cholerę nie mogę wyświetlić sl_ulice.NAZWA w templatce listSuccess.php
próbowałem róźnych metod - ostatnia jest taka (fragment):
  1. <?php foreach ($sl_adresys as $sl_adresy): ?>
  2. <tr>
  3. <td><?php echo link_to($sl_adresy->getIdAdres(), 'sl_adresy/show?id_adres='.$sl_adresy->getIdAdres()) ?></td>
  4. <td><?php echo $sl_adresy->getIdPrefix() ?></td>
  5. <td><?php echo $sl_adresy->getIdUlicy() ?></td>
  6. <td><?php echo $sl_adresy->getNumer() ?></td>
  7. <td><?php echo $sl_adresy->getIdKodPocztowy() ?></td>
  8. <td><?php echo $sl_adresy->getIdArkusz() ?></td>
  9. <td><?php echo $sl_adresy->getX() ?></td>
  10. <td><?php echo $sl_adresy->getY() ?></td>
  11.  
  12. <td><?php echo $sl_adresy->getString(9) ?></td>
  13. </tr>
  14. <?php endforeach; ?>

i otrzymuję: Fatal error: Call to undefined method Sl_Adresy::getString()
Sprawdziłem także dla $sl_adresy->getString(1) - ten sam błąd.
Przecież; getString() nie jest zwiazany z Sl_Adresy ?

Czy też mój problem można rozwiązać nie przy pomocy propela tylko creole i zrobic same hydro (patrz - to do mnie - odpowiedź wyżej) ? ale zapytanie sql jest generowane dobrze.

pozdrawiam
pawel_k
nie wiem czemu się dziwisz że wywala błąd, w dodatku dość oczywisty.
getString jest metodą creolowego resultseta a nie metodą obiektu propelowego. pole nazwa jest zapewne tam gdzie powinno być, czyli w odpowiednim obiekcie...
proponuję zamiast $this->sl_adresys = Sl_AdresyPeer::doSelect($c); zrobić $this->sl_adresys = Sl_AdresyPeer::doSelectRs($c); i przerobić widok.
SongoQ
@phpion.com Patrze o co pytasz i jak bys przeczytal My first symfony project lub kilka rozdzialow to bys znalazl rozwiazanie.

Taka uwaga: Najpierw czytamy manual, jesli nie ma rozwiazania to szukamy na forum symfony a potem zadajemy pytania.
misiaczekmarek
@pawl_k

dzięki za sugestie, zastosowałem, przerobiłem i działa 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.