Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework] Pobieranie danych z kilku tabel
spokz
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.01.2007

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


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.

Ten post edytował spokz 7.04.2010, 19:09:03
Go to the top of the page
+Quote Post
pgrzelka
post
Post #2





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

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


  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)
Go to the top of the page
+Quote Post
spokz
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.01.2007

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


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
Go to the top of the page
+Quote Post
pgrzelka
post
Post #4





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

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


  1. $select -> setIntegrityCheck ( false );



ps. takie operacje masz opisane w manualu

Ten post edytował pgrzelka 8.04.2010, 11:49:27
Go to the top of the page
+Quote Post
spokz
post
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.01.2007

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


Dzięki za pomoc. Ale co do manuala to nie wiem (IMG:style_emoticons/default/smile.gif)

http://framework.zend.com/search?query=set...p;search=Search!
Go to the top of the page
+Quote Post
chlebik
post
Post #6





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


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

Ten post edytował chlebik 8.04.2010, 23:12:23
Go to the top of the page
+Quote Post
spokz
post
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.01.2007

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


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ć?
Go to the top of the page
+Quote Post
chlebik
post
Post #8





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


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.
Go to the top of the page
+Quote Post
spokz
post
Post #9





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.01.2007

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


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.
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 - 16:07