Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony/propel] Problem z addJoin
Forum PHP.pl > Forum > PHP > Frameworki
kopczyk
Witam mam taki problem podczas pobierania danych z trzech tabel:
w tabeli ktorej rekord pobieram znajduja sie dwa klucze obce do pozostalych dwoch z ktorych potrzebuje pobrac pole title.
Robie tak:
Kod
    $c = new Criteria();
    $c->add(theaMenuItemPeer::MENU_ITEM_ID , $this->getRequestParameter('menu_item_id') );
    $c->addJoin(theaMenuItemPeer::SYSTEM_ID , theaLinkPeer::SYSTEM_ID);
    $c->addJoin(theaMenuItemPeer::MENU_ID , theaRegisteredMenuPeer::MENU_ID);
    $this->thea_menu_item = theaMenuItemPeer::doSelect( $c );
    $this->thea_menu_item = $this->thea_menu_item[0];

w efekcie dostaje poprawne zapytanie, w wyniku ktorego powinno byc wszystko czego potrzebuje:
Cytat
SELECT thea_menu_item.MENU_ITEM_ID, thea_menu_item.SYSTEM_ID, thea_menu_item.MENU_ID, thea_menu_item.CREATED_AT FROM thea_menu_item, thea_link, thea_registered_menu WHERE thea_menu_item.MENU_ITEM_ID=1 AND thea_menu_item.SYSTEM_ID=thea_link.SYSTEM_ID AND thea_menu_item.MENU_ID=thea_registered_menu.MENU_ID


Mój cały problem polega na tym ze ni mam zielonego pojecia jak dobrac sie do tych danych sciana.gif

Próbowałem robic cos takiego:
Kod
$this->thea_menu_item->getTheaLink()->getTitle();


Ale to kłóci się trochę z tym co napisałem wcześniej ponieważ dochodzi kolejne niepotrzebne zapytanie do bazy:

Cytat
SELECT thea_link.SYSTEM_ID, thea_link.MODULE_ID, thea_link.MODULE_ITEM_ID, thea_link.TITLE, thea_link.POSITION, thea_link.LINK_TYPE, thea_link.EXPAND, thea_link.CREATED_AT FROM thea_link WHERE thea_link.SYSTEM_ID=1


Bardzo proszę Was o pomoc, ponieważ na pewno jest jakiś optymalny sposób aby pobrać dane z trzech tabel w jednym zapytaniu.

Pozdrawiam
mike
Jeśli masz ładnie zdefiniowane relacje to w klasach *Peer masz na pewno metodę doSelectJoinAll(). Dołączy ona automatycznie wszystkie obiekty wskazane przez klucze. Masz też zawsze dostępne metody doSelectJoin*(), gdzie * to nazwa obiektu, który chcesz dołączyć.

Skorzystaj z tych metod.

  1. <?php
  2.  
  3. $c = new Criteria();
  4. // ...
  5. $this->thea_menu_item = theaMenuItemPeer::doSelectJoinAll($c);
  6. // lub
  7. $this->thea_menu_item = theaMenuItemPeer::doSelectJoinTheaLink($c);
  8.  
  9. ?>


Acha jest jeszcze jeden niuans w tym wszystkim. Metody do joinowania obiektów Propel generuje tak by były jak najmniej kosztowne.
Jeśli miałbyś z tym jakieś problemy, wyniki zapytań będą nie takie jak powinny być to zajrzyj do tych metod.

W tym przypadku najprawdopodobniej w BasetheaMenuItemPeer::doSelectJoinTheaLink() powinieneś mieć w pewnym miejscu takie coś:
  1. <?php
  2.  
  3. // ...
  4. $criteria->addJoin(theaMenuItemPeer::THEA_LINK_ID, theaLinkPeer::ID);
  5. // ...
  6.  
  7. ?>

Skopiuj wtedy tą funkcję do klasy theaMenuItemPeer zmieniając tą linijkę na:
winieneś mieć w pewnym miejscu takie coś:
  1. <?php
  2.  
  3. // ...
  4. $criteria->addJoin(theaMenuItemPeer::THEA_LINK_ID, theaLinkPeer::ID, CRITERIA::JOIN_LEFT);
  5. // ...
  6.  
  7. ?>

Problem często pojawia się kiedy przy wyszukiwaniu chcesz dołączyć obiekty w wynikach. Propel nie serwuje często wtedy rekordów, które referują do NULLi.
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.