Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Jak połączyć relacje z joinami
Forum PHP.pl > Forum > PHP > Frameworki
CuteOne
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.
ShadowD
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.
CuteOne
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.
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.