Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-08-2010 18:20:47

shugyosha
Nouveau membre
Date d'inscription: 04-08-2010
Messages: 4

[Zend_Db_Table_Abstract][1.10.2] Informations sur la commande find()

Bonjour a tous,

Je suis nouveau sous Zend et je découvre Zend_Db. Je trouve ce système tres utile mais malgré mes recherches, je n'arrive pas a trouver une solution efficace à un petit souci que j'ai : lors de l'appel de la commande $table->find.....() pour récupérer les entrées d'une table dépendante liée, j'aimerais ajouter une clause en fonction de certains champs de la table dépendante.

Je sais que tout cela n'a pas l'iar très clair donc voici un petit exemple pour ceux qui voudraient m'aider :
Table Personne :
- id
- name

Table Voiture :
- id
- Personne_id
- name
- marque

$personnes étant une instance de 'class Personnes extends Zend_Db_Table_Abstract'.
Comment faire pour avoir toutes les voitures d'une personnes d'une certaine marque ? Y'a t-il une méthode magique pour faire cela ?

Merci d'avance.

Hors ligne

 

#2 04-08-2010 19:10:40

Intiilapa
Membre
Date d'inscription: 03-02-2009
Messages: 95

Re: [Zend_Db_Table_Abstract][1.10.2] Informations sur la commande find()

Tu trouveras des informations dans la documentation officielle avec ce lien : http://framework.zend.com/manual/fr/zen … .fetch-all.

Dernière modification par Intiilapa (04-08-2010 19:11:02)

Hors ligne

 

#3 05-08-2010 09:08:57

shugyosha
Nouveau membre
Date d'inscription: 04-08-2010
Messages: 4

Re: [Zend_Db_Table_Abstract][1.10.2] Informations sur la commande find()

Bonjour Intiilapa,

Je te remercie pour ta réponse aussi rapide. Cependant je connaissais déjà cette page de la documentation. J'ai du mal exprimer ma question. En fait, je ne trouve pas de fonction magique qui me permettrait de faire l'équivalent des codes suivant :

Code:

// recuperation d'une personne
$personne = $personnes->find('x')->current();

// recupération des voitures de type 'cabriolet'
// version 1
$voituresRowset = $personne->findVoitures();
$voituresList = array();
foreach($voituresRowset as $voiture){
    if($voiture->type == 'cabriolet') $voituresList[] = $voiture;
}

// version 2
$voituresList = $voitures->fetchAll(array('type="cabriolet"', "personne_id=" . $personne->id))

La deuxieme version parait bien plus simple et optimisée mais je trouve qu'on perd le lien de chainage. C'est pour cela que je voulais savoir si une fonction magique existait pour faire quelque chose du genre :

Code:

$voitures = $personne->findVoituresBy/WithType('cabriolet')

Ce genre de fonction serais bien plus simple à la relecture et plus intuitive je pense.

Connaitrais-tu une fonction de ce genre stp ?

Hors ligne

 

#4 05-08-2010 19:38:02

Intiilapa
Membre
Date d'inscription: 03-02-2009
Messages: 95

Re: [Zend_Db_Table_Abstract][1.10.2] Informations sur la commande find()

Tu utilises déjà la méthode magique qui existe : findVoitures() (ndlr find<TableClass>()). La méthode telle que tu la décris n'existe pas, mais il ne tient qu'à toi de la définir dans une classe hérite de Zend_Db_Table_Abstract. Tu peux te baser sur le code existant de la méthode Zend_Db_Table_Abstract::__call().

Je pensais plus à ce genre de codes dans ce que je t'indiquais :

Code:

$id = 1;
$personne = new Model_DbTable_Personne;
$select = $personne->select()
    ->join('cabriolet', "cabriolet.id_personne = {$personne->info(Zend_Db_Table::NAME)}.id")
    ->where('personne_id = ?', $id)
    ->where('type = ?', 'cabriolet');
$voituresCabriolets = $personne->fetchAll($select);

Ensuite, si tu zappes le côté magique que tu désires, tu peux ajouter une méthode findVoituresByType() à ta classe Model_DbTable_Personne. Ce qui donne :

Code:

class Model_DbTable_Personne extends Zend_Db_Table_Abstract
{
    protected $_name = 'personne';

    /**
      * @param int $personne_id
      * @param string $type
      * @return Zend_Db_Table_Rowset_Abstract
      */
    public function findVoituresByType($personne_id, $type)
    {
        $name = $this->info(self::NAME);

        $select = $this->select()
            ->join(
                'voiture',
                "voiture.id_personne = $name.id"
            )
            ->where('personne_id = ?', $personne_id)
            ->where('type = ?', $type)
            ->order('voiture_id');

        return $this->fetchAll($select);
    }
}

$id = 1;
$personne = new Model_DbTable_Personne;
$voituresCabriolets = $personne->findVoituresByType($id, 'cabriolet');

Après tu es libre d'utiliser les relations entre les tables pour ajouter de l'abstraction au nom de la table voiture, la clé primaire de personne, la clé étrangère de voiture, etc. Ainsi, tu modifies les informations d'une table à un seul endroit, cela se "propage" pour adapter les requêtes. C'est plus simple à maintenir.

Dernière modification par Intiilapa (05-08-2010 19:40:50)

Hors ligne

 

#5 20-08-2010 13:06:13

shugyosha
Nouveau membre
Date d'inscription: 04-08-2010
Messages: 4

Re: [Zend_Db_Table_Abstract][1.10.2] Informations sur la commande find()

Bonjour,

Au final, j'utilise une methode mixée pour résoudre ce souci :

Code:

// recuperation d'une personne
$personne = $personnes->find('x')->current();

// recupération des voitures de type 'cabriolet'
$voitures = new Voitures();
$where = $voitures->select()->where('type="cabriolet"');
$personne->findVoitures($where);

C'est pas exactement ce que je voulais mais c'est ce qui s'en rapproche le plus.
Merci à tous

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages