Blog développeur

« Etudie, non pour savoir plus, mais pour savoir mieux. »

Zend Framework

Faire une jointure

Par Guillaume Sarramegna, le 5 oct. 2011

Ceci est mon premier article, que d'émotions... Mais venons en aux choses sérieuses.

Lorsque vous avez cherché à faire des jointures entre vos tables, vous avez peut-être rencontré ce message d'erreur :

Select query cannot join with another table

Ceci est dû au fait que ZF ne permet pas de sélectionner des champs provenants d'autres tables que la table présente dans le FROM.

L'objet Zend_Db_Table_Select est destiné à sélectionner des données sur une table précise. Des jointures peuvent être faites, mais il n'est pas possible de sélectionner des colonnes ne faisant pas partie de la table sous jacente. Cependant, ceci aurait pu être utile dans certains cas, et l'objet Zend_Db_Table_Select possède une clause spéciale déverrouillant cette limitation. Passez la valeur false à sa méthode setIntegrityCheck. Il est alors possible de sélectionner des colonnes hors table. Attention toutefois, l'objet row/rowset résultant sera verrouillé. Impossible d'y appeler save(), delete() ou même d'affecter une valeur à certains de ses champs. Une exception sera systématiquement levée.

De ce fait, afin de contourner cette restriction, il convient d'appeler la méthode setIntegrityCheck() de la classe Zend_Db_Select comme ceci.

<?php

class Application_Model_DbTable_Articles extends Zend_Db_Table_Abstract {
    protected $_name = 'articles';
    protected $_primary = 'idArticle';

    public function obtenirArticleEtCommentaires($idArticle) {
    	$select = $this->select()->setIntegrityCheck(false)
    				->from(array('a' => $this->_name), array('*'))
    				->joinLeft(array('c' => 'commentaires'), 'c.idArticle = a.idArticle', array('*'))
    				->joinLeft(array('u' => 'utilisateurs'), 'u.idUtilisateur = c.idUtilisateur', array('nomUtilisateur'))
    				->where('a.idArticle = ?', $idArticle);
    	return $this->fetchAll($select);
    }
}

Rien de plus, rien de moins. Votre requête devrait maintenant correctement se lancer.

A bientôt !

0 commentaire

Votre commentaire