Bonjour, je m'entraine à manipuler les méthodes findDependentRowset, findParentRow et findManyToManyRowset.
Dans ce but j'ai construis ce petit modèle :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 CREATE TABLE IF NOT EXISTS `personnes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nom` varchar(50) NOT NULL, `prenom` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `personnes` (`id`, `nom`, `prenom`) VALUES (2, 'nom1', 'prenom1'), (3, 'nom2', 'prenom2'); CREATE TABLE IF NOT EXISTS `livres` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_personne` int(11) NOT NULL, `nom` varchar(50) NOT NULL, PRIMARY KEY (`id`), KEY `id_personne` (`id_personne`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; INSERT INTO `livres` (`id`, `id_personne`, `nom`) VALUES (2, 2, 'livre php'), (3, 3, 'livre java'), (4, 2, 'livre C'); ALTER TABLE `livres` ADD CONSTRAINT `livres_ibfk_1` FOREIGN KEY (`id_personne`) REFERENCES `personnes` (`id`) ON DELETE CASCADE;
Mon bootstrap contient entre autres ces 2 méthodes :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 protected function _initDb() { $db = $this->getPluginResource('db')->getDbAdapter(); $db->setFetchMode(Zend_Db::FETCH_OBJ); Zend_Db_Table_Abstract::setDefaultAdapter($db); return $db; } protected function _initAutoLoader() { $autoLoader = new Zend_Loader_Autoloader_Resource(array( 'BasePath' => APPLICATION_PATH, 'namespace' => 'Sim' )); $autoLoader->addResourceType('db', 'models/tables', 'Table'); return $autoLoader; }
J'ai également crée 2 modèles pour mes tables que j'ai défini ainsi :
Table Personnes :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 class Sim_Table_Personnes extends Zend_Db_Table_Abstract { protected $_name = 'personnes'; protected $_primary = 'id'; protected $_dependentTables = array('Sim_Table_Livres'); public function getPersonnes() { $select = $this->select(); return $this->fetchAll($select); } public function getDependantLivres() { return $this->find(2)->current()->findDependentRowset('Sim_Table_Livres'); } }
Table Livres:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class Sim_Table_Livres extends Zend_Db_Table_Abstract { protected $_name = 'livres'; protected $_primary = 'id'; protected $_referenceMap = array( 'relation' => array( 'columns' => array('id_personne'), 'refTableClass' => 'Sim_Table_Personnes', 'refColumns' => array('id') ) ); public function getParentPersonne() { return $this->find(2)->current()->findParentRow('Sim_Table_Personnes'); } }
Pour finir j'ai crée 2 controllers Personnes et Livres ainsi qu'une action list listant respectivement tous les livres de la personne ayant l'id 2 et la personne qui est le lecteur du livre dont l'id est 2 (exemple un peu triviaux mais bon...)
Pour mon cas 1, c'est bon :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public function listAction() { $personnes = new Sim_Table_Personnes(); $this->view->livres = $personnes->getDependantLivres(); }
Ma vue récupère bien mes livres correspondant à l'id 2. Par contre dans le cas 2, j n'arrive pas à remonter au lecteur connaissant l'id d'un livre, j'ai cette erreur :
Ma vue est la suivante :Notice: Trying to get property of non-object in C:\wamp\www\zftable\application\views\scripts\livres\list.phtml on line 4
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 foreach($this->personne as $pers) echo $pers->nom;
et mon action est la suivante :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public function listAction() { $livres = new Sim_Table_Livres(); $this->view->personne = $livres->getParentPersonne(); }
Je pense pas que ce soit grand chose, mais ca me turlupine...d'autant plus que le cas de récupérer les livres connaissant le lecteur (cas inverse donc) marche parfaitement...
Petite question subsidaire () :
Comment faire pour récupérer que certains champs en utilisant un find() ?
Merci et désolé pour mon explication "usine à gaz"
EDIT: info complémentaire : un print_r($this->personne) m'informe que je récupére bien l'enrgistrement (2, nom1, prenom1) mais je n'arrive pas à fetcher en objet comme dans le cas 1 et je vois pas pourquoi...
Partager