Archiv für den Monat: März 2012

No reference from table X to table Y

Referenzen der Datenbank im Zend Framework über das Model abzubilden ist ja eine gute Idee. Schnell ist das entsprechende Skelett des Model erstellt und die Doku lehrt uns: „Definier die $_referenceMap und alles wird gut.“. Dachte ich auch … aber

Wer das schon einmal ausprobiert hat, der weiß: Im aber steckt der Wurm im Apfel bzw. die Titelmeldung auf dem Schirm. Aber langsam und zum mitmachen:

Gegeben sind 2 Datenbanktabellen „news“ und „author“, news hat u.a. ein Feld authorId. Den Rest könnt ihr euch vorstellen.

class myApp_Model_News extends Zend_Db_Table_Abstract {

protected $_name = 'news';
protected $_primary = 'id';

protected $_referenceMap = array(

'TrouperId' => array(

'columns' => array('author_id'),
'refTableClass' => 'author',
'refColumns' => array('id')

)

);

}

Instinktiv benutzt man das und hier meldet sich auch gleich eine Fehlermeldung:
No reference from table myApp_Model_News to table myApp_Model_Author
Aber warum? Wir haben doch alles richtig gemacht.

Prinzipiell ja, laut Doku, aber nicht laut programmiertem Code, dafür muss man nämlich nicht den Tabellennamen in die $_referenceMap eintragen, sondern den Namen des Models!!!
Also so:

class myApp_Model_News extends Zend_Db_Table_Abstract {

protected $_name = 'news';
protected $_primary = 'id';

protected $_referenceMap = array(

'TrouperId' => array(

'columns' => array('author_id'),
'refTableClass' => 'myApp_Model_Author',
'refColumns' => array('id')

)

);

}

Besonders mal auf „refTableClass“ sehen, dort steht nun nicht mehr der Tabellenname wie er in der Datenbank steht, sondern der Name des Models, dass für diese Tabelle zuständig ist.
Und nun funktioniert das ganze auch mit

$news = new myApp_Model_News();
$myNews = $news->fetchRow();
$newsauthor = $myNews->findDependentRowset('myApp_Model_Author');