Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Zend] Relacje
Forum PHP.pl > Forum > PHP > Frameworki
Fluke
Witam. Ostatnio eksperymentuje z Zendem i mam problem z relacjami. Wiem jak zrobić proste relacje ale nie wiem w jaki sposób zrobić o to przykłąd:
W pewnej relacji wybieramy jakieś rekordy z tabeli związanej ale chcemy do tego ograniczyć pewne żeczy np: jeżeli pole "ABC" != NULL czyli warunek where.

Przykład:
Tabela "Users" ||--->00 'images'
Wybieramy 1 użytkownika i wszystkie jego obrazki ale nie wybieramy tych które mają wartość "active" == NULL

Mam o to taki kod:
  1. <?php
  2.  
  3. //Rodzic
  4. class A extends Zend_Db_Table_Abstract {
  5. protected $_name = 'a';
  6. protected $_primary_key = 'aID';
  7. protected $_dependentTable = array('B');
  8.  
  9. function get($id) {
  10. $Result = $this->find($id);
  11.  
  12. $RowCurrent = $Result->current();
  13. $Dep = $RowCurrent->findDependentRowset('B');
  14. //...
  15. }
  16. }
  17.  
  18. //Dziecko
  19. class B extends Zend_Db_Table_Abstract {
  20. protected $_name = 'b';
  21. protected $_primary_key = 'bID';
  22. protected $_referenceMap = array(
  23. 'A' => array(
  24. 'columns' => array('aID'),
  25. 'refColumns' => array('bID'),
  26. 'refTableClass' => 'A'
  27. )
  28. );
  29. }
  30. ?>


Wszystko fajnie wybiera ale właśnie chce jeszcze ograniczyć po przez jakieś wartośći.

Z góry dziękuję.

Chyba znalazłem swoją odpowiedź ale nie wiem czy dobrze że tak się robi.
Mianowicie, żeby ograniczyć jeszcze w jakiś sposób trzeba skorzystać z metody 'select' z Zend_Db_Table_Select.

Czyli jeżeli mamy:
  1. <?php
  2.  
  3. //Rodzic
  4. class A extends Zend_Db_Table_Abstract {
  5. protected $_name = 'a';
  6. protected $_primary_key = 'aID';
  7. protected $_dependentTable = array('B');
  8.  
  9. function get($id) {
  10. $Result = $this->find($id);
  11.  
  12. //Dodajemy tutaj te 2 liniki
  13. $ModelB = new B();
  14. $query = $ModelB->select()->where('pole1 = ?', 2);
  15.  
  16. $RowCurrent = $Result->current();
  17. $Dep = $RowCurrent->findDependentRowset('B', null, $query); //oraz objekt typu Zend_Db_Table_Select czyli $query
  18. //...
  19. }
  20. }
  21.  
  22. //Dziecko
  23. class B extends Zend_Db_Table_Abstract {
  24. protected $_name = 'b';
  25. protected $_primary_key = 'bID';
  26. protected $_referenceMap = array(
  27. 'A' => array(
  28. 'columns' => array('aID'),
  29. 'refColumns' => array('bID'),
  30. 'refTableClass' => 'A'
  31. )
  32. );
  33. }
  34. ?>

Nie wiem tylko do czego służy to null w metodzie findDependentRowset();
Nie wiem czy jest to dobrze ale na pewno działa. Jak macie lepsze rozwiązania to chętnie posłucham.
5k7
Ja na twoim miejscu zrobiłbym relacje w samej bazie a zenda do tego bym nie pchał bo więcej się przy tym napocisz niż to warte. Na bazę poświecisz chwile, na te powiązania dużo więcej. Poza tym wydaje mi się że dużo wydajniejsze są relacje w bazie.
Ges
http://framework.zend.com/manual/en/zend.d...ationships.html

Tu masz opis tego po co jest drugi parametr.
W skrócie Definiuje on regułę zależności która możesz zdefiniować.
W 3 parametrze mozesz jeszcze dodawać select dodatkowego typu limity etc...

Co do zrobienia tej samej relacji w bazie danych - to zależy na co stawiasz smile.gif
Jak chcesz mieć mapowanie obiektów pomiędzy PHP a bazą to idziesz w dobrym kierunku.
Rozwiązanie o tyle wygodne, że jak nagle będziesz chciał któreś obiekty trzymać w innej bazie (albo na przykład w mongoDb) to wystarczy podstawić inny adapter i śmiga. Jak zrobić relacje w bazie danych to znacznie się ograniczysz.
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.