Manipulation de dépendances inter-tables
Bonjour, je m'entraine à manipuler les méthodes findDependentRowset, findParentRow et findManyToManyRowset.
Dans ce but j'ai construis ce petit modèle :
Code:
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:
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:
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:
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:
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 :
Citation:
Notice: Trying to get property of non-object in C:\wamp\www\zftable\application\views\scripts\livres\list.phtml on line 4
Ma vue est la suivante :
Code:
1 2 3
|
foreach($this->personne as $pers)
echo $pers->nom; |
et mon action est la suivante :
Code:
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" :mouarf:
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...