Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework]Jak połączyć relacje z joinami
CuteOne
post
Post #1





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Witam,

szukałem odpowiedzi w necie ale nic sensownego nie znalazłem, więc może tutaj ktoś spotkał się z podobnym problemem i zna rozwiązanie. Na początek trochę kodu

  1. class Model_DbTable_ProductTable extends Zend_Db_Table_Abstract {
  2.  
  3. protected $_name = 'products';
  4.  
  5. protected $_dependentTables = array('Model_DbTable_ProductCommentTable');
  6. }
  7.  
  8.  
  9. class Model_DbTable_CommentTable extends Zend_Db_Table_Abstract {
  10.  
  11. protected $_name = 'comments';
  12.  
  13. protected $_dependentTables = array('Model_DbTable_ProductCommentTable');
  14. }
  15.  
  16.  
  17. class Model_DbTable_ProductCommentTable extends Zend_Db_Table_Abstract {
  18.  
  19. protected $_name = 'products_comments';
  20.  
  21. protected $_referenceMap = array(
  22. 'product' => array(
  23. 'columns' => 'product_id',
  24. 'refTableClass' => 'Model_DbTable_ProductTable',
  25. 'refColumns' => 'product_id'
  26. ),
  27. 'comment' => array(
  28. 'columns' => 'comment_id',
  29. 'refTableClass' => 'Model_DbTable_CommentTable',
  30. 'refColumns' => 'comment_id'
  31. )
  32. );
  33. }


mapper
  1. class Model_Mapper_ProductMapper {
  2.  
  3. public function __construct() {
  4.  
  5. $this->_dbTable = new Model_DbTable_ProductTable();
  6. }
  7.  
  8. public function getProducts() {
  9.  
  10. return $this->_dbTable->fetchAll(
  11. $this->_dbTable -> select()
  12. -> from($this->_dbTable)
  13. -> where('product_status = ?', 1)
  14. );
  15. }
  16.  
  17. public function getComments() {
  18.  
  19. $products = $this->getProducts();
  20.  
  21. $rows = array();
  22. foreach($products as $k => $product) {
  23.  
  24. $rows[$k] = $this->_rowSet -> findManyToManyRowset(
  25. 'Model_DbTable_CommentTable',
  26. 'Model_DbTable_CommentProductTable'
  27. );
  28. }
  29. }
  30. }


jak widać w metodzie Model_Mapper_ProductMapper:: getComments() dla każdego produktu pobierane są komentarze. Jeżeli wyświetlam 20 produktów to dodatkowo muszę zrobić 20 zapytań... obłęd. Stąd moje pytanie jak elegancko pobrać produkty i komentarze w jednym zapytaniu? Oczywiście join() w select'cie odpada.

Ten post edytował CuteOne 22.07.2012, 04:47:43
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
ShadowD
post
Post #2





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

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


Też miałem taki problem i gdzieś nawet mój temat powinien być i jest to strasznie zamieszane - nawet wewnętrzne łączenie tabel zend'a działa na zasadzie kolejnego zapytania. Jedyne co przyszło mi a tamtą chwilę do głowy to pobrać listę wszystkich newsów, potem na jej podstawie pobrać WSZYSTKIE komentarze dopasowane do nich i łączenie tego za pomocą php. Z mojej wiedzy wynika że nie da się stworzyć zapytania pobierającego newsy i komentarze za jednym razem tak by to nie zabijało servera.


--------------------
Mój blog - o wszystkim i niczym ale zazwyczaj związane z informatyką! ;-)
Githube

Usługi spawalnicze i monterskie | Park linowy Lublin i Okunince
Go to the top of the page
+Quote Post
CuteOne
post
Post #3





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Hmm podobne odpowiedzi znalazłem na necie sad.gif ehh więc będzie trzeba joinować w select'cie

"Z mojej wiedzy wynika że nie da się stworzyć zapytania pobierającego newsy i komentarze za jednym razem tak by to nie zabijało servera."
Dla wszystkich newsów pewnie tak ale dla 10-20 nie powinno to stanowić problemu.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 05:20