Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php/propel] Tabele n-m
mrjozo
post
Post #1





Grupa: Zarejestrowani
Postów: 142
Pomógł: 3
Dołączył: 27.06.2007

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował mrjozo 23.05.2008, 11:47:44
Go to the top of the page
+Quote Post
destroyerr
post
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
mrjozo
post
Post #3





Grupa: Zarejestrowani
Postów: 142
Pomógł: 3
Dołączył: 27.06.2007

Ostrzeżenie: (0%)
-----


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ę?

Ten post edytował mrjozo 23.05.2008, 12:14:20
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 17:54