Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Le titre ce se post ne doit pas être très clair mais je vais tenter de l'éclaircir.
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... )
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:
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
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.
Je suis très intéressé par cette réponse.
Dernière modification par wiwidumi (14-04-2009 20:06:14)
Hors ligne
J'ai trouvé une solution et vu que ça peut te servir, la voici
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
Hors ligne
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.
Hors ligne
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
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
Pages: 1