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)