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() )
Zend_Db_Table_Select problem
Tagged on:             

3 thoughts on “Zend_Db_Table_Select problem

  • 2011-12-26 at 08:54
    Permalink

    Istnieje tez mozwilosc ustawienia w query setintegritycheck na false.

    Reply
  • 2011-12-27 at 14:14
    Permalink

    można też użyć $select->setIntegrityCheck(false); i wtedy obejdzie sie bez pustej tablicy jako 3 parametr

    Reply
  • 2012-01-12 at 14:15
    Permalink

    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)

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Social Widgets powered by AB-WebLog.com.