Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-04-2009 22:36:05

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Table_Abstract: Récupérer un Rowset avec une OrderBy sur table jointe

Le titre ce se post ne doit pas être très clair mais je vais tenter de l'éclaircir. wink

J'ai deux objets "Zend_Db_Table_Abstract" liés : TArticle et TArticlesPriority

Au niveau de la modélisation de ma base de donnée, un Article a une Priorité. Une Priorité peut être affectée à plusieurs Articles.

En PHP, mon implémentation résemble à ça.
(Le code ci-dessous ne fonctionne pas mais c'est pour vous montrer l'idée. J'ai essayé plusieurs manière, plus réalistes que ci-dessous, mais sans succès... sad)

Code:

class TArticle extends Zend_Db_Table_Abstract
{
    protected $_name = 'articles';
    protected $_primary = 'id';
    protected $_rowClass = 'Article';

    protected $_referenceMap = array(
        'ArticlesPriority' => array(
        'columns'           => 'articles_priority_id',
        'refTableClass'     => 'TArticlesPriority'
        )
    );

    public static function findByTitle($title, $count = NULL, $offset = 0)
    {
        $article = new TArticle();
        return $user->fetchAll('actived = 0', 'pseudo', $limit, $offset) ->
                        order(array('articles_priorities.order_num ASC', 'article.date_creation DESC'))->
                        limit($limit, $offset);
    }
}

Ce que j'aimerais, c'est récupérer tous les articles (sous forme d'objets Articles dans un rowset) ordonnés par priorité.

En SQL, ça donnerait un truc dans le genre:

Code:

SELECT a . *
FROM articles a
INNER JOIN articles_priorities p ON a.articles_priority_id = p.id
ORDER BY p.order_num
LIMIT 0 , 10
;

Est-ce possible? Et si oui comment?

Dernière modification par Davjack (06-04-2009 01:30:55)

Hors ligne

 

#2 14-04-2009 20:04:49

wiwidumi
Membre
Date d'inscription: 14-04-2009
Messages: 19

Re: Table_Abstract: Récupérer un Rowset avec une OrderBy sur table jointe

J'ai le même problème, j'ai un formulaire des recherche/filtre sur plusieurs tables, je souhaite récupérer le rowset d'une seule table en fonction des informations de mon formulaire, le problème qui se pose après avoir fait ma requête avec les jointures  est l'impossibilité de récupérer le résultat de cette table sous forme de rowset. sad

Je suis très intéressé par cette réponse.

Dernière modification par wiwidumi (14-04-2009 20:06:14)

Hors ligne

 

#3 14-04-2009 22:09:09

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Table_Abstract: Récupérer un Rowset avec une OrderBy sur table jointe

J'ai trouvé une solution et vu que ça peut te servir, la voici wink

Code:

    public static function findByTitle($title, $limit = NULL, $offset = 0)
    {
        $article = new TArticle();
        $select = $article->select()->
        from(array("a" => "articles"))->
        join(array("p" => "articles_priorities"),
                        "a.articles_priority_id=p.id", NULL)->
        where('title LIKE ?', '%'.$title.'%')->
        limit($limit, $offset);
        return $article->fetchAll($select, array('p.order_num ASC', 'a.date_creation DESC'), $limit, $offset);
    }

En gros, je passe un select contenant la jointure au fetchAll.

En espérant que ça pourra t'aider wink

Hors ligne

 

#4 14-04-2009 22:54:59

wiwidumi
Membre
Date d'inscription: 14-04-2009
Messages: 19

Re: Table_Abstract: Récupérer un Rowset avec une OrderBy sur table jointe

En fait c'est ce que j'ai fait au début, j'ai cette d'erreur:

Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY093]: Invalid parameter number: no parameters were bound'

Alors que pour les requêtes sans jointure cela marche. sad

Hors ligne

 

#5 15-04-2009 14:26:38

Davjack
Membre
Date d'inscription: 06-02-2009
Messages: 32

Re: Table_Abstract: Récupérer un Rowset avec une OrderBy sur table jointe

Tu as bien passé les 3 paramètres à la méthodes join? Parce que d'après l'exception générée, tu as trop ou pas assez de variables passées en paramètre.

Hors ligne

 

#6 15-04-2009 16:51:29

wiwidumi
Membre
Date d'inscription: 14-04-2009
Messages: 19

Re: Table_Abstract: Récupérer un Rowset avec une OrderBy sur table jointe

En fait j'ai trouver l'erreur j'ai oublié de quote ma requête. Le fetchAll fonctionne mais il me renvoie tous les rows de la table systématiquement, je ne sais pas pourquoi.
La solution que j'ai mis en place et qui fonctionne est:

$result = $this->getAdapter()->quote($select);
$arrayresult = $this->getAdapter()->fetchCol($result); //ma requête ne renvoie qu'un seule colonne, les id de ma table
$rowsetresult = $this->find($arrayresult); // Grâce à l'array des id je récupère le rowset

Pour les 3 arguments je crois que ce n'est pas obligatoire de le spécifier tous, je définie déjà les colonnes que je veux afficher ainsi que le listage directement dans ma requête.

Dernière modification par wiwidumi (15-04-2009 16:52:12)

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