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 :

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 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...