W najnowszym projekcie spotkałem się z dość dziwnym problemem dotyczącym wykonywania zapytania, podczas którego należało zrobić join na dwóch tabelach.
Tabela, dla której przygotowywane było zapytanie została zdefiniowana następująco:
class SmartGroup_Model_PlaceTable extends SmartGroup_Model_Table { protected $_name = 'place'; protected $_primary = 'placeId'; protected $_referenceMap = array( 'Country' => array( 'columns' => array('countryId'), 'refTableClass' => 'country', 'refColumns' => array('countryId') ) ); }
Natomiast kod, który odpowiedzialny był za wykonanie zapytania prezentuje się następująco:
$table = new SmartGroup_Model_PlaceTable(); $select = $table->select(); $select->join( 'country', 'place.countryId = country.countryId' ) ->order( 'country.name asc') ->order( 'place.address asc'); $result = $table->fetchAll( $select );
Niestety przy próbie wykonania tego zapytania otrzymałem wyjątek “Zend_Db_Table_Select_Exception” z komunikatem: “Select query cannot join with another table”. Okazało się, że przyczyną tego problemu było wywołanie metody join. Zdefiniowałem w niej dwa parametry: tabelę, które ma być dołączana oraz relację wiązania. Powinny być zdefiniowane jednak co najmniej trzy parametry, zgodnie z definicją metody join:
public function join($name, $cond, $cols = self::SQL_WILDCARD, $schema = null)
pomimo tego, że trzeci parametr jest predefiniowany. Rozwiązanie okazało się więc całkiem banalne i sprowadziło się do dodania pustej tablicy jako trzeciego parametru funkcji, co w rezultacie dało:
$select->join( 'country', 'place.countryId =country.countryId', array() )
Istnieje tez mozwilosc ustawienia w query setintegritycheck na false.
można też użyć $select->setIntegrityCheck(false); i wtedy obejdzie sie bez pustej tablicy jako 3 parametr
Jako 3 parametr można też przekazać null to jest IMHO bardziej czytelne.
Ponadto, jak już wspomniano wyżej
$select->setIntegrityCheck(false); <- jeśli chcesz pobrać "więcej" kolumn niż znajduje się w oryginalnej tabeli (ale uwaga, taki rowset jest wtedy tylko do odczytu)