Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-08-2007 18:38:43

nohrad
Membre
Lieu: Lyon
Date d'inscription: 25-08-2007
Messages: 11

[Zend_Db][1.0.1] ORM et liaison des tables

Bonjour @ tous,

Je suis en train de construire un projet sous ZF et je m'intéresse de prêt à l'implantation de l'ORM sous ZF. C'est la première fois que j'utilise une telle méthode et je ne suis pas sur d'avoir encore tout compris.
Voilà donc mon problème, à vous de me dire si je suis dans la bonne direction ou si je dois encore me replonger quelques heures dans la doc wink  !!!

Je suis en train de mettre au point un module de petite annonce.
J'ai deux tables : classifieds et classified_cats.

Voici mes deux modèles :

Code:

class Classified extends Db_Table_Abstract
{
    protected $_name                 = 'classifieds';    
    protected $_primary             = 'id';    
    
    protected $_referenceMap = array(
        'cat' => array(                                    
            'columns' => 'cat_id',                  
            'refTableClass' => 'ClassifiedCat',     
            'refColumns' => 'id'                         
            ),
    );
}

Code:

class ClassifiedCat extends Db_Table_Abstract 
{
    protected $_name             = 'classified_cats';    
    protected $_primary             = 'id';
    protected $_dependentTables = array('Classified');
}

Mon problème est que lorsque que j'utilise une instance de Classified avec par exemple un fetchAll je n'obtiens pas les données de la table de liaison (je n'ai par exemple que l'id de la catégorie mais pas le nom de cette catégorie présent dans la table classified_cats).

Je pense donc qu'il y a une erreur dans mon mapping mais je ne sais vraiment pas où ?!! hmm

Merci d'avance @ tous ceux qui pourront me donner un coup de main !

Hors ligne

 

#2 01-09-2007 21:28:03

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Zend_Db][1.0.1] ORM et liaison des tables

C'est normal car Zend_Framework utilise le mode LazyLoading, qui ne charge pas les collections en cascade.
Ainsi un enregistrement d'une table représente bien la valeur de chaque colonne SQL correspondant, il faut soit-même aller chercher l'objet en liaison dont on extrait ensuite les valeurs. Dans ton cas (en détaillant):

Code:

<?php
$Classifieds = $Classified->find('1'); // retourne in Rowset, comme fetchAll() our createRow()
$Classified1 = $Classifieds->current(); // retourne le premier Row (en théorie le seul)
$ClassifiedCat = $Classified1->findParentClassifiedCat(); // retourne un Row (le parent)
$name = $ClassifiedCat->nom; // retrouve le nom

J'ai écrit un article rapide sur ce comportement il y a quelques temps.

Hors ligne

 

#3 02-09-2007 11:59:59

nohrad
Membre
Lieu: Lyon
Date d'inscription: 25-08-2007
Messages: 11

Re: [Zend_Db][1.0.1] ORM et liaison des tables

Okay, tout me parait plus claire maintenant.

En revanche quel est alors l'intérêt d'utiliser la portion de code que tu m'a montré qui, si je comprend bien nécessite deux requêtes SQL, alors qu'on peut simplement écrire une méthode dans son modèle qui se charge de faire une seule requête SQL avec jointure et d'avoir le résultat escompté ???

En fait plus généralement, j'ai du mal à voir l'utilité des déclarations de dépendances ($_dependentTables et $_referenceMap) dans les modèles...

Hors ligne

 

#4 04-09-2007 10:01:26

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Zend_Db][1.0.1] ORM et liaison des tables

C'est vrai.
Un fetch va regénérer une requête (avec ou sans jointure selon le cas), ce qui va gaspiller une ressource, c'est sûr. En réalité le fait est qu'actuellement le système est comme ça. Charger les collections en cascade est dangereux car ça peut faire boucler la base, ou alors récupérer une quantité trop grosse de données, il faudrait implémenter un niveau de profondeur.
De plus on a pas necéssairement tout le temps besoin d'avoir une chaine de collections.
Je n'ai pas regardé si c'est au programme, mais il est possible que dans le futur ça soit implémenté.

Il te reste la solution de coder toi-même la requête à la main, dans la classe métier smile

Hors ligne

 

#5 04-09-2007 11:51:12

nohrad
Membre
Lieu: Lyon
Date d'inscription: 25-08-2007
Messages: 11

Re: [Zend_Db][1.0.1] ORM et liaison des tables

Bon au final, c'est pas que je n'avais pas compris, c'est que je cherchais une fonctionnalité qui n'était pas (encore ?) implanté !

Effectivement on a pas toujours besoin de charger les tables dépendantes en cascades, mais dans certains cas cela serait bien pratique (par exemple un site multilingue qui a en permanence une table foo_bar et une table locale_foo_bar avec une liaison par id et une clé primaire avec id,lang sur la table locale). Si le système était mis en place on pourrait par exemple spécifier via un flag dans nos modèle si on veut un LazyLoading ou un FullLoading et dans ce dernier cas on pourrait spécifier un niveau de profondeur... D'ailleurs est-ce que quelqu'un sait où on peut voir la roadmap officiel du ZF ???

En attendant que cela soit (peut-être) implanté dans une future version du framework, je vais coder mes requêtes à la mai wink !!!

Hors ligne

 

#6 04-09-2007 13:58:00

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Zend_Db][1.0.1] ORM et liaison des tables

Il n'y a pas de roadmap précise à long terme, mais on trouve ce doc sur le site du ZF :
http://framework.zend.com/whyzf/future/
Cette page donne une idée des orientations futures du ZF.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#7 04-09-2007 14:20:14

nohrad
Membre
Lieu: Lyon
Date d'inscription: 25-08-2007
Messages: 11

Re: [Zend_Db][1.0.1] ORM et liaison des tables

En fouillant un peu j'ai fini par déniché un post intéressant sur l'issue tracker de ZF : http://framework.zend.com/issues/browse/ZF-1156.

Et voilà la réponse apporté au niveau du support d'un ORM full-loading

This is a pretty fancy new feature. I have changed the issue type to 'new feature'.

This is part of being an object-relational mapping (ORM), and Zend_Db_Table has a long way to go to provide that functionality. The scope of work for Zend_Db_Table is to provide the Table Data Gateway and Row Data Gateway patterns, not a fully features ORM.

That would be a really great product, but we cannot do this in the short term with Zend_Db. I will leave the issue open though and perhaps someday we will do it.

Bref, c'est surement pas demain qu'on trouvera du full-loading dans ZF, mais c'est assez compréhensible car cela demande un développement important !

Hors ligne

 

#8 04-09-2007 14:34:19

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Zend_Db][1.0.1] ORM et liaison des tables

CakePHP le fait lui ^^

Bon ça va je me tais XD
PS : une roadmap de Zend_Db peut être trouvée ici : http://framework.zend.com/wiki/display/ZFDEV/DB+Team

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