![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 5.01.2008 Skąd: Jelenia Góra Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 |
|
|
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
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.
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ś:
Skopiuj wtedy tą funkcję do klasy theaMenuItemPeer zmieniając tą linijkę na: winieneś mieć w pewnym miejscu takie coś:
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. Ten post edytował mike 13.06.2008, 09:24:40 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 06:59 |