Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour, j'ai une classe Batiment où dedans, j'ai une méthode qui me renvoi tout mes bâtiments sous forme d'un tableau d'objet.
Dans ma vue, j'effectue un foreach pou pouvoir interagir sur chacun de mes objets.
Sur chacun de mes objets, j'appelle la méthode getSecteur() qui se situe dans la class row de cette objet mais j'ai une erreur comme quoi je fais appel à une méthode qui n'est pas définie alors qu'elle l'est belle et bien..
Voici mon controlleur:
$batiments = $batiment->getBatimentsByIdSecteur($idSecteur); $this->view->batiments = $batiments;
Ma vue:
foreach($this->batiments as $unBatiment) { echo "<tr> <td>" . $unBatiment->nom . "</td> <td>" . $unBatiment->getSecteur() . "</td> <td>" . $unBatiment->nbrInscrits . "</td> </tr>"; }
Ma classe row (BatimentRow):
<?php class BatimentRow extends Zend_Db_Table_Row_Abstract { public function getSecteur() { return $this->getTable()->getAdapter()->fetchOne("SELECT s.nom FROM Secteur s, Batiment b, Couvrir c WHERE s.id = c.idSecteur AND b.id = c.idBatiment AND b.id = " . $this->id); } }
Pourquoi j'ai cette erreur svp?
Dernière modification par Absot (12-10-2011 13:58:13)
Hors ligne
Bonjour,
Pourrais-tu nous donner le code complet du controlleur (en fait surtout l'instanciation de $batiment), ainsi que le code de la classe de $batiment ?
Hors ligne
Voici le code de mon controller:
<?php require_once "Batiment.php"; class IndexController extends Zend_Controller_Action { public function init() { } public function indexAction() { $idSecteur = $this->_getParam("idSecteur", 0); $batiment = new Batiment(); $batiments = $batiment->getBatimentsByIdSecteur($idSecteur); $this->view->batiments = $batiments; } }
Si jamais $idSecteur == 0, alors je prends tout les bâtiments dans ma méthode getBatimentByIdSecteur();
La classe Batiment:
class Batiment extends Zend_Db_Table_Abstract { // Nom de la table protected $_name = 'Batiment'; // Clé primaire protected $_primary = 'id'; protected $_rowClass = 'BatimentRow'; public function getBatimentsByIdSecteur($idSecteur) { $db = $this->getAdapter(); $db->setFetchMode(Zend_Db::FETCH_OBJ); if($idSecteur == 0) { return $db->fetchAll("SELECT * FROM Batiment"); }else { return $db->fetchAll("SELECT * FROM Batiment b, Secteur s, Couvrir c WHERE b.id = c.idBatiment AND c.idSecteur = s.id AND s.id = " . $idSecteur); } }
Hors ligne
Si tu fais un Zend_Debug::dump($this->batiments); dans ta vue, tu verras que tes objets ne sont pas des batimentrow...
Hors ligne
En faisant ça, j'obtiens un objet stdClass, il faut que je fasse quoi pour obtenir des batimentsrow (j'ai regardé la documentation mais je ne trouve pas que c'est clair)?
Dernière modification par Absot (10-10-2011 18:13:21)
Hors ligne
J'ai réussi à me retourner mon tableau avec la méthode fetchAll() et des options mais si je veux exécuter une requête particulière avec des jointures, comment je dois l'écrire avec la méthode fetchAll()?
En SQL, elle resemblerait à ça:
"SELECT * FROM Batiment b, Secteur s, Couvrir c WHERE b.id = c.idBatiment AND c.idSecteur = s.id AND s.id = " . $idSecteur;
J'ai essayé de cette façon avec fetchAll():
fetchAll('Batiment.id = Couvrir.idBatiment AND Couvrir.idSecteur = Secteur.id AND Secteur.id = ' . $idSecteur);
J'obtiens une erreur comme quoi Couvrir.idBatiment n'existe pas..
Hors ligne
Bonjour,
Tu devrais peut-être construire ta requête en utilisant les méthodes de la classe Zend_Db_Table (select(), from(), where(), ...).
Hors ligne
Pour l'instant j'en suis à ça:
$row = $this->fetchAll($this->select() ->from(array( "Batiment", array('id'), "Couvrir", array('idSecteur', 'idBatiment'), "Secteur", array('id') )) ->where() ->order('nbrInscrits DESC') );
Je suis bloqué à mon where() parce que j'ai plusieurs champs id donc peut-être qu'ils vont être confondu et je ne sais pas comment faire et si j'essaie par exemple avec where('Batiment.id = Couvrir.idBatiment'), j'ai l'erreur comme quoi la colonne Couvrir.idBatiment n'existe pas.
Hors ligne
Je pense que ton WHERE est "erroné" dans la mesure où tu devrais plutôt utiliser des jointures entre tes tables "Batiments" et "Couvrir" d'une part, puis entre "Couvrir" et "Secteur" d'autre part !
Ce qui donnerait quelque chose comme suit :
[lang=php] $row = $this->fetchAll( $this->select() ->setIntegrityCheck(false) ->from( array( 'b' => 'Batiment' ) ) ->join( array( 'c' => 'Couvrir' ), 'b.id = c.idBatiment' ) ->join( array( 's' => 'Secteur' ), 'c.idSecteur = s.id' ) ->where() ->order( 'nbrInscrits DESC' ) );
Dernière modification par f.garoby (11-10-2011 14:06:01)
Hors ligne
La requête fonctionne mais ce n'est pas le résultat que je souhaiterais avoir.
Voici les tables en questions:
. Batiment
- id
- nom
- nbrInscrits
. Couvrir
- id
- idBatiment
- idSecteur
. Secteur
- id
- nom
Je souhaiterais que ça me renvoi toutes les informations de ma table Batiment (Rowset) pour qu'ensuite je puisse faire des traitements dessus.
La requête que tu as proposés renvoi l'id du batiment ["id"], le nom du secteur ["nom"], et le nombre d'inscrits du bâtiment ["nbrInscrits"].
En regardant la documentation, elle montre qu'apparemment il n'y a pas d'option dans la méthode select()..
Hors ligne
Comme l'indique la documentation que tu cites, il faut renseigner le 2° argument de la méthode 'from()', soit en y mettant '*', soit en citant les champs désirés, soit en mettant null pour indiquer qu'on n'en veut aucun.
Hors ligne
J'ai réussi ma requête!
Voilà ma requête final:
$row = $this->fetchAll($this->select() ->setIntegrityCheck(false) ->from(array( 'b' => 'Batiment' ), '*') ->join(array( 'c' => 'Couvrir'), 'b.id = c.idBatiment', null) ->join( array('s' => 'Secteur'), 'c.idSecteur = s.id', null) ->where('s.id = ?', $idSecteur) ->order('nbrInscrits DESC') );
Merci de l'aide de tout le monde.
Hors ligne
Finalement, elle n'est pas résolu.
J'ai utilisé du jQuery pour faire de l'Ajax et quand je raffraichi ma page avec Ajax, j'obtiens bien mes Rowset avec leur propriété mais je n'ai plus accès à ma méthode row, ca ne me renvoi rien, j'ai essayé en faisant appel une méthode qui renvoi "1" et ça fonctionne, j'ai pensé à tricher et à appeler une méthode dans ma classe dans mon controlleur en donnant en paramètre tout mes objets mais bon, ce n'est peut-être pas la meilleure méthode je pense..
Pourquoi ma méthode ne fonctionne plus?
Edit: lorsque j'appelle la page pour la première fois, j'appelle la méthode row qui me retourne un objet stdclass et quand je rappelle cette méthode avec l'Ajax, ca me retourne un tableau associatif, comment ça se fait puisque la méthode est strictement la même..?
Dernière modification par Absot (12-10-2011 13:55:18)
Hors ligne