Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/propel] Tabele n-m
Forum PHP.pl > Forum > PHP > Object-oriented programming
mrjozo
Witam,

Mam 3 tabele jak poniżej:

  1. <?php
  2. games:
  3. id: ~
  4. title:  varchar(255)
  5. categories:
  6. id: ~
  7. title:  varchar(255)
  8. catgame:
  9. id: ~
  10. categories_id: ~
  11. games_id: ~
  12. ?>


i kod:
  1. <?php
  2. $pager = new sfPropelPager('Games', 5);
  3. $c = new Criteria();
  4. $c->addDescendingOrderByColumn(GamesPeer::CREATED_AT);
  5. $c->add(CatgamePeer::CATEGORIES_ID, $this->getRequestParameter('id',1));
  6.  $c->addJoin(GamesPeer::ID,CatgamePeer::GAMES_ID, 'LEFT JOIN');
  7. $pager->setCriteria($c);
  8. $pager->setPage($this->getRequestParameter('page', 1));
  9. $pager->setPeerMethod('doSelect');
  10. $pager->init();
  11. $this->games_pager = $pager;
  12.  
  13. foreach($this->games_pager->getResults() as $games) {
  14.      $catRefs = $games->getCatgamesJoinCategories();
  15.      $cat = null;
  16.       foreach($catRefs as $ref) {
  17.             $cat[] = $ref->getCategories(); 
  18.        }
  19.      $games->sth = $cat;
  20. }
  21.  
  22. foreach($this->games_pager->getResults() as $games) {
  23.      print_r($games->sth);
  24. }
  25. ?>


Niestety taki sposób dodania kolejnego obiektu do games nie przechodzi bo w drugim foreach mam:

  1. <?php
  2. Notice: Undefined property: Games::$sth
  3. ?>



Chodzi mi o to iż chcę pobrać 5 gier z danej kategorie i dla każdej z nich chcę mieć przypisane wszystkie kategorie do których należy? Jak mogę to zrobić?
destroyerr
Przyczyna jest prosta. Metoda getResults wykonuje zapytanie do bazy przy każdym jej wywołaniu więc obiekty Games są tworzone od nowa. Obiekty $games w linijce 18 i 22 to osobne obiekty, nie mają z sobą nic wspólnego (o ile wersja propela jest mniejsza od 1.3 - tam chyba ma to być inaczej).

Rozwiązaniem Twojego problemu są metody, które generuje propel.
  1. <?php
  2. foreach($games->getCatGames() as $catGames)
  3. {
  4. $categories = $catGames->getCategories();
  5. }
  6. ?>

Mogłem się pomylić co do nazw, ale to sobie już poprawisz winksmiley.jpg
mrjozo
Z podpowiedzią zrobiłem tak:

  1. <?php
  2. $pager = new sfPropelPager('Games', sfConfig::get('app_pager_homepage_max'));
  3. $c = new Criteria();
  4. $c->addDescendingOrderByColumn(GamesPeer::CREATED_AT);
  5. $c->add(CatgamePeer::CATEGORIES_ID, $this->getRequestParameter('id',1));
  6. $c->addJoin(GamesPeer::ID,CatgamePeer::GAMES_ID, 'LEFT JOIN');
  7. $pager->setCriteria($c);
  8. $pager->setPage($this->getRequestParameter('page', 1));
  9. $pager->setPeerMethod('doSelect');
  10. $pager->init();
  11. $this->games_pager = $pager;
  12.  
  13. $games = $this->games_pager->getResults();
  14.  
  15. foreach($games as $game) {
  16. $catRefs = $game->getCatgamesJoinCategories();
  17. $cats = null;
  18. foreach($catRefs as $ref) {
  19. $cats[] = $ref->getCategories(); 
  20. }
  21. $game->cats = $cats;
  22.  
  23. }
  24. $this->games_list = $games;
  25. ?>


i działa. Dzięki wielkie.

Nie wiem czy to jest optymalne wyjście aby wykonać operację, którą chcę?
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.