Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Pobieranie danych z kilku tabel
Forum PHP.pl > Forum > PHP > Frameworki
spokz
Witam.

W jaki sposób pobrać dane z kilku tabel za pomocą jednego zapytania w Zendzie?

W tej chwili mam dwie tabele: produkty i dostępność. W tabeli dostępność są różne rodzaje dostępności np. na magazynie, na zamówienie itp. W tabeli produkty jest kolumna dostępność_id, dzięki której każdy produkt ma przypisaną dostępność.
Tylko nie wiem w jaki sposób zrobić zapytanie, które zrobi mi join'a łaczącego te tabele. I nie chodzi o treść zapytania gdyż myślę, że poniższe jest dobrze wpisane w kontroler:

  1. $select = $produkty->select();
  2. $select->from(array('p' => 'produkty', 'd' => 'dotepnosc'), array('p.id','p.nazwa','p.model','p.cena','p.opis', 'c.nazwa'));
  3. $select->join(array('d'),'p.dostepnosc_id = d.id');
  4.  
  5. $this->view->produkty = $produkty->fetchProducts();
  6.  

tylko chodzi o wyznaczanie tabel, z których framework ma pobierać dane, gdyż w tej chwili pobiera tylko z tabeli wpisane w modelu "Products":
  1. protected $_name = 'cs_products';


a nie z $selecta którego opisałem powyżej.
I mam ten problem w każdym przypadku, nie mówiąc o przypadkach kiedy będę chciał pobrać dane z więcej niż 2 tabel.

Bardzo proszę o pomoc, gdyż jestem początkujący w Zendzie i php ogólnie i nie mogę sobie sam poradzić z tym problemem.
pgrzelka
  1. $select->join(array('d'=>'INNA_TABELA'),'p.dostepnosc_id = d.id');


i teraz aby pobrać te rekordy możesz np zrobić
  1. $select->query()->fetchAll();


ewentualnie
  1. $produkty->getAdapter()->fetchAll($select)
spokz
Po modyfikacjach wygląda to tak:

  1. $select = $produkty->select();
  2. $select->from(array('p' => 'produkty', 'd' => 'dotepnosc'), array('p.id', 'p.nazwa', 'p.model', 'p.cena', 'p.opis', 'd.nazwa'));
  3. $select->join(array('d' => 'dostepnosc'), 'p.dostepnosc_id = d.id');
  4.  
  5. $this->view->produkty = $produkty->getAdapter()->fetchAll($select);


i pojawia się niestety błąd:

  1. Fatal error: Uncaught exception 'Zend_Db_Table_Select_Exception' with message 'Select query cannot join with another table' in \lib\Zend\Db\Table\Select.php:215 Stack trace: #0 \lib\Zend\Db\Adapter\Abstract.php(456): Zend_Db_Table_Select->assemble() #1 \lib\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Table_Select), Array) #2 \lib\Zend\Db\Adapter\Abstract.php(706): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Table_Select), Array) #3 \app\controllers\TlistController.php(35): Zend_Db_Adapter_Abstract->fetchAll(Object(Zend_Db_Table_Select)) #4 \lib\Zend\Controller\Action.php(513): TlistController->indexAction() #5 \lib\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction') #6 \lib\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(O in \lib\Zend\Db\Table\Select.php on line 215
pgrzelka
  1. $select -> setIntegrityCheck ( false );



ps. takie operacje masz opisane w manualu
spokz
Dzięki za pomoc. Ale co do manuala to nie wiem smile.gif

http://framework.zend.com/search?query=set...p;search=Search!
chlebik
Nie lepiej tak:

  1. $oDb = Zend_Registry::get('db');
  2. $oSelect = $oDb->select();
  3.  
  4. $oSelect->from( 'produkty AS p', array( 'id','nazwa','model','cena','opis' ) )
  5. ->join( 'dostepnosc AS d', 'p.dostepnosc_id = d.id', array( 'tutaj','kolumny','do','wyciagniecia','z','tej','tabeli' ) );
  6.  
  7. $aRes = $oDb->fetchAll( $oSelect );



I w ogole w sumie nie lepiej dla ww. sytuacji po prostu zrobic typ wyliczeniowy w tabeli 'produkty'? Po co dodatkowy JOIN skoro mozna to bardzo obrazowo (bo slowami) opisac poprzez dostepne elementy dla kolumny (plus walidacja na poziomie insertow do bazy)?
spokz
Cytat(chlebik @ 9.04.2010, 00:11:59 ) *
I w ogole w sumie nie lepiej dla ww. sytuacji po prostu zrobic typ wyliczeniowy w tabeli 'produkty'? Po co dodatkowy JOIN skoro mozna to bardzo obrazowo (bo slowami) opisac poprzez dostepne elementy dla kolumny (plus walidacja na poziomie insertow do bazy)?


A mógłbyś na moim przykładzie zilustrować jak to zrobić?
chlebik
A co tu do mowienia - na 99% zakladam, ze uzywasz MySQLa - dodatkowa kolumna 'dostepnosc' jako pole typu ENUM z wartosciami 'w magazynie','oczekiwanie','brak' i po temacie. Przy wkladaniu kolejnego rekordu do bazy bedziesz tez musial podac od razu dostepnosc produktu (byc moze przydaloby sie tutaj umozliwic wkladanie wartosci NULL). I po sprawie.
spokz
Dobra rzecz, ale jeśli w tabeli produkty mam oprócz dostępności jeszcze inne kolumny będące kluczami obcymi dla innych tabel np. marka, gwarancja to czy to będzie tak samo wydajne? Poza tym nigdy wcześniej nie bawiłem się Enumami.

Btw. używam Postgresa.
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.