Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-03-2011 14:17:01

rekam
Nouveau membre
Date d'inscription: 15-03-2011
Messages: 1

Jointures, select... c'est pas si compliqué, et pourtant... ?

Bien le bonjour!

me voilà fort emprunté. J'ai beau avoir parcouru la documentation de Zend_Db de long en large, je n'arrive toujours pas à faire la plus simple requête à l'aide de l'objet select().

Premièrement, j'ai de la peine à comprendre la différence entre Zend_Db_Select et Zend_Db_Table_Abstract::select(). Le second apporte une modification à la méthode from(). Il en fait un INNER JOIN (Zend 1.11.4). Donc ça me fait beau planter mes requêtes :S ...

Mais bon, voici mon modèle tout bête :

Code:

class Library_Book extends Zend_Db_Table_Abstract {

    protected $_primary = 'id';

    protected $_name = 'library_book';

    protected $_dependentTables = array('Library_Book_Niveau');

}

class Library_Niveau extends Zend_Db_Table_Abstract {

    protected $_primary = 'id';

    protected $_name = 'library_niveau';

    protected $_dependentTables = array('Library_Book_Niveau');

}

class Library_Book_Niveau extends Zend_Db_Table_Abstract {

    protected $_primary = array('book_id', 'niveau_id');

    protected $_name = 'library_book_niveau';

    protected $_referenceMap = array(
        'Book' => array(
            'columns' => array('book_id'),
            'refTableClass' => 'Library_Book',
            'refColumns' => array('id')
        ),
        'Niveau' => array(
            'columns' => array('niveau_id'),
            'refTableClass' => 'Library_Niveau',
            'refColumns' => array('id')
        )
    );

}

Jusque là, c'est encore plus ou moins juste? Je n'en suis pas même sûr... Enfin bref, là dessus, j'essaie de faire ceci:

*Récupérer tous les livres qui ont un niveau dont l'id = x*

Ainsi, voici ce que je tente de faire:

Code:

        $table = new Library_Book();
        $select = $table
            ->select()
            ->from(array('library_book' => 'library_book'), array())
            ->joinLeft(array('nb' => 'library_book_niveau'), 'library_book.id = nb.book_id', array())
            ->joinLeft(array('n' => 'library_niveau'), 'n.id = nb.niveau_id', array())
            ->where('nb.niveau_id = ?', 1)
            ->order('n.label ASC')
            ->limit($limit, $start);

echo $select;

Aussi curieux que cela paraisse, ça me fait une requête comme ceci:

Code:

SELECT "library_book_2".* FROM "library_book"
 LEFT JOIN "library_book_niveau" AS "nb" ON library_book.id = nb.book_id
 LEFT JOIN "library_niveau" AS "n" ON n.id = nb.niveau_id
 INNER JOIN "library_book" AS "library_book_2" ...

J'ai d'autres questions aussi, mais je crois que je vais commencer par ça. Peut-être que je comprendrai mieux la suite tongue ...

Merci d'avance!
rekam

Dernière modification par rekam (15-03-2011 14:22:31)

Hors ligne

 

#2 15-03-2011 15:17:33

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Re: Jointures, select... c'est pas si compliqué, et pourtant... ?

Bonjour,
En général je procède comme suit :

Code:

$table = new Library_Book();
        $select = $table->select();

        $select->from(array('library_book' => 'library_book'), array()) 
            ->joinLeft(array('nb' => 'library_book_niveau'), 'library_book.id = nb.book_id', array())
            ->joinLeft(array('n' => 'library_niveau'), 'n.id = nb.niveau_id', array())
            ->where('nb.niveau_id = ?', 1)
            ->order('n.label ASC')
            ->limit($limit, $start);

// Ensuite :
        $stmt = $select->query();
        $result =  $stmt->fetchAll();

Par contre je ne comprend pas pourquoi des array vide?
Il suffit de ne rien mettre : from(array('library_book' => 'library_book'))  .

Il y a aussi la possibilité d'utiliser les dépendances, cf http://www.zendcasts.com/may-to-many-wi … m/2009/05/

Ensuite pour les question de fonctionnement de Zend_Db plus en profondeur je passe le relai.

Dede


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages