Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
je bloque sur une requête qui ne passe pas correctement dans une boucle :
Pour être plus clair je vous présente le bout de code :
// On récupére les horaires de l'offre $horaires = new Horaires(); $this->view->horairesOffre = $horaires->fetchAll('id_horaire='.$ID_offre); /* En passant dans la boucle les résultats de la requête précédente j'espère récupérer une liste de mes enregistrements qui correspondent aux jours et aux horaires de l'offre */ foreach ($this->view->horairesOffre as $ho) { $Intervenants = new Horaires(); $where[] = "jour = '$ho->jour'"; $where[] = "heureDebut >= '$ho->heureDebut'"; $where[] = "heureFin <= '$ho->heureFin'"; $where[] = "id_horaire >'400000000'"; // Les intervenants avec des horaires compatibles : $this->view->intervenant = $Intervenant->fetchAll($where,"id DESC"); Zend_Debug::dump($this->view->intervenant); /* Le problème est que $this->intervenant ne récupère qu'une partie des résultats souhaités : en effet il ne me sort qu'un seul jour alors que dans $ho il y a plusieurs jours*/ (...)
Je sais que c'est un problème qui n'est pas forcément propre à ZF... mais si une personne pouvaut me filer un coup de main, ca pourrait me dépanner, surtout que j'ai déjà passer pas mal de temps à bricoler des essais sans résultats.
Merci à vous, a+ tschtong
Dernière modification par tschtong (08-01-2008 19:05:12)
Hors ligne
Bonjour,
Essaye en suivant une syntaxe similaire pour tes clauses where :
$where = array( "jour = ?" => $ho->jour, "heureDebut >= ?" => $ho->heureFin, "heureFin <= ?" => $ho->heureFin, "id_horaire > ?" => 400000000, ) ...
Dernière modification par Phoenix17 (08-01-2008 19:03:43)
Hors ligne
Super merci à toi, mais quelle différence y a t-il entre ta méthode et la mienne ?
A+ tschtong
Hors ligne
Bun à ma connaissance, les noms des champs et les valeurs seront echapées pour éviter toutes injections sql.
Je ne suis pas sûr que ta méthode le permette... je ne suis pas sûr, mais si cela se trouve, c'est du pareil au même.
Sinon pour te problème, je ne vois pas trop, à la rigueur, balance nous un extrait de ta table 'Horaires'.
D'ailleurs, j'ai remarqué que tu réinstancié le même model (Horaires) à l'intérieur de ta boucle foreach ($Intervenants), or ce n'est pas utile vu qu'elle l'est déjà plus haut ($horaires).
Hors ligne
dans $ho il y a plusieurs jours
$ho ou $this->view->horairesOffre? Car $ho est une row, il ne peux donc pas y avoir plusieurs jours.
Autre remarque tu fait
$this->view->intervenant = ...
$this->view->intervenant ne comportera que le dernier fetchAll de ta boucle. Tu devrais plutôt mettre un tableau.
Hors ligne
Phoenix17 a écrit:
Sinon pour te problème, je ne vois pas trop, à la rigueur, balance nous un extrait de ta table 'Horaires'.
D'ailleurs, j'ai remarqué que tu réinstancié le même model (Horaires) à l'intérieur de ta boucle foreach ($Intervenants), or ce n'est pas utile vu qu'elle l'est déjà plus haut ($horaires).
Non mais c'est bon maintenant. En fait c'était du aux clauses where. J'ai modifié comme tu me l'as indiqué et là pas de prob il me sort bien autant de tableaux qu'il y a de jours dans $ho.
Mr.MoOx a écrit:
$this->view->intervenant ne comportera que le dernier fetchAll de ta boucle. Tu devrais plutôt mettre un tableau.
En fait je vous ai montré qu'une partie du code. En fait au final je rempli effectivement un autre tableau dans cette même boucle.
Merci à vous !
a+ tschtong
Hors ligne
ce n'est pas très performant de faire ainsi de multiple requête
il vaut mieux faire une seule requête avec une jointure
A+JYT
Hors ligne
Surtout qu'il attaque toujours le même model : "Horaires" avec les données du model lui même.
Y a une incohérance quelque part ...
Hors ligne
foreach ($this->view->horairesOffre as $ho) { $Intervenants = new Horaires(); $where[] = "jour = '$ho->jour'"; $where[] = "heureDebut >= '$ho->heureDebut'"; $where[] = "heureFin <= '$ho->heureFin'"; $where[] = "id_horaire >'400000000'"; etc...
Tu dois te retrouver avec un array $where énorme à la fin de ta boucle si tu ne le remet p as à "zéro" à chaque début d'itération.
Hors ligne