Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-03-2010 17:24:08

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

[Héritage de table BDD]Comment procedez-vous ?

Bonjour,


Pour résumer la question :
Comment réalisez-vous vos héritage d'objet métier ? Que se soit en base de données ou/et en programmation avec Zend.
Si vous réalisez l'héritage de table avec MySQL en utilisant un système de clé étrangère pour les classes parentes, comment réalisez-vous votre application Zend ?

-----

Après plusieurs jours de lecture autours de ZF, je me suis rendu compte qu'il n'était pas possible de réaliser l'héritage de table avec l'ORM de Zend; du moins, pas simplement.

Mais alors, comment faites-vous ?
Il est très courant au sein des MCD d'avoir de l'héritage, et cet héritage n'est pas toujours intéressant que sur les données, mais aussi sur les traitements.

Prenons l'exemple simple d'un Produit, qui a un titre et un code.
Toutes les classes qui hérite de Produit doivent pouvoir être retrouvé en fonction de leur code.

Si l'héritage de table n'est pas possible avec MySQL, il aurai pu être simulé avec Zend et les DbTable. Cela n'est pas le cas, mais devrai l'être avec Doctrine 2 et donc ZF2 (me trompe-je ?)

Vous avez bien une structure du type
- Model : Produit, Yaourt, Fromage
- Mapper : Produit, Yaourt, Fromage
- DbTable : Produit, Yaourt, Fromage

Grâce à l'utilisation de Vue SQL, et un peu de bricolage dans les Mapper, on peut réaliser l'héritage en lecture facilement. L'écriture étant un peu diffèrent.

Cela se traduit au niveau SQL, par deux tables FromageView et YaourtView qui agrègent toutes deux, Produit/Yaourt et Produit/Fromage en passant par la clé étrangère.

On configure DbTable_Yaourt et DbTable_Fromage pour qu'il ai respectivement comme attribut _name : YaourtView et FromageView.

Au niveau des Mapper, Mapper_Yaourt et Mapper_Fromage appelleront la fonction fillObject (celle qui permet de remplir un Model_Produit à partir d'un Rowset).

Et nous réalisons un héritage de class des Model. Model_Yaourt et Model_Fromage hériteront donc de Model_Produit.

Avec ca, on simule la lecture sur les clés primaires; et on regroupe un bons nombres de fonctionnalités.


Mais QUID de la fonction de recherche par Code qui est commune à tout les produits.
La solution la plus simple, c'est de réaliser cette fonction au sein des Mapper et des DbTable de chaque type d'objet... Mais bon, c'est affreusement moche et surtout lourd à maintenir.


Et vous, vous faites comment ?

Dernière modification par armetiz (08-03-2010 11:32:09)

Hors ligne

 

#2 06-03-2010 10:49:29

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Héritage de table BDD]Comment procedez-vous ?

pourquoi tu dit qu'on peut pas faire d'héritage c'est de l'objet comme d'autre LOO

pourquoi tu fais pas DbTable_Yaourt extends DbTable_Produit et DbTable_Fromage extends DbTable_Produit ?

c'est simple est ça fonctionne.

perso j'ai la structure suivante

Zend_Db_Table
Fast_Db_Table  (classe table commune à toutes mes applications c'est là que je capitalise d'une appli sur l'autre)
Application_Db_Table (classe de base pour les tables de mon application)
Module_Db_Table (une par module qui capitalise les éléments commun aux table d'un module)

et ensuite en fonction du modèle les table du modèle et l'héritage issue de la modélisation métier

si j'ai une méthode commune aux tables d'un module je la mets dans la classe Module_Db_Table correspondante si la méthode est commune à plusieurs tables au travers de toute l'application c'est dans
Application_Db_table que je la mets. et si j'estime que c'est suffisamment portable et intéressant pour être reporté sur d'autres application je le mets dans Fast_Db_Table ainsi toute mes futures applications en profitent.

et si je pense que cela intéresse la communauté je fais une proposition d'évol à ZF en attendant qu'elle soit intégré ou rejeté je le laisse dans Fast_Db_Table.

lorsque ZF évolue je réadapte Fast_Db_Table pour en tenir compte.

Je suis assez étonné de voir le nombres d'artifices mis en oeuvre dans ZF pour ne pas faire d'héritage. alors que souvent il suffit de dériver une classe de base pour faire ce qu'on veut de façon simple.

A+JYT

Hors ligne

 

#3 06-03-2010 15:18:31

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: [Héritage de table BDD]Comment procedez-vous ?

Merci de ta réponse,
Malheureusement, je n'arrive toujours pas à voir comment...

J'ai essayé de réaliser l'héritage sur les DbTable et donc d'avoir DbTable_Yaourt extends DbTable_Produit et DbTable_Fromage extends DbTable_Produit.

Dans DbTable_Fromage il y aura la propriété "_name" qui contiendra le nom de la table "Fromage". Au niveau de MySQL, l'héritage de table n'est pas possible. Cela implique la chose suivante :
Si l'on prend la class DbTable_Fromage avec juste l'extends DbTable_Produit, et que l'on utilise la fonction insert (), l'insertion se fera alors dans la table Fromage mais pas dans la table Produit, de plus nous aurons une exception de levée pour les données de produit qui ne sont pas connues au sein de Fromage.
Et c'est ici que je bloque... Car je sens qu'il y a un truc a faire mais je ne comprends pas quoi..


Pour en revenir à ta structure (car je rappel que je débute), tu aurai donc eu un Module "Produit" ?

Dans l'attente de tes nouvelles,
Thomas.

Hors ligne

 

#4 06-03-2010 19:30:38

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Héritage de table BDD]Comment procedez-vous ?

effectivement tu ne peut pas faire un héritage dans mySQL comme on le fait avec postgreSQL si tu utilise une relation entre les table produit yaourt et fromage pour faire de l'héritage ZF ne te permet pas directement de le gérer. il faut pour cela surcharger les méthodes insert et update de Zend_Db_Table pour les remplacer par la transaction SQL appropriée.

A+JYT

Hors ligne

 

#5 08-03-2010 09:41:32

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: [Héritage de table BDD]Comment procedez-vous ?

Ah cool, je ne suis pas trop loin de la réalité fonctionnelle :p

Je vais continuer de lire encore - et encore - de la documentation Zend pour comprendre un peu mieux ta démarche.

Merci de tes réponses en tout cas.

Cdt,
Thomas.

Hors ligne

 

#6 08-03-2010 11:31:43

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: [Héritage de table BDD]Comment procedez-vous ?

J'ai modifié le 1° post et son titre.
Car je ne pense pas que se soit une question anodine, surtout que Zend a pour vocation de structurer le développement d'application PHP.

Pour résumer la question :
Comment réalisez-vous vos héritage d'objet métier ? Que se soit en base de données ou/et en programmation avec Zend.
Si vous réalisez l'héritage de table avec MySQL en utilisant un système de clé étrangère pour les classes parentes, comment réalisez-vous votre application Zend ?

Hors ligne

 

#7 06-02-2012 12:11:15

offnight
Nouveau membre
Date d'inscription: 06-02-2012
Messages: 1

Re: [Héritage de table BDD]Comment procedez-vous ?

Bonjour, je me permet de déterrer cette question car elle n'a toujours pas été répondue, donc : Si vous réalisez l'héritage de table avec MySQL en utilisant un système de clé étrangère pour les classes parentes, comment réalisez-vous votre application Zend ?
Cordialement wink

Hors ligne

 

#8 29-10-2012 16:36:52

L0rD59
Nouveau membre
Date d'inscription: 29-10-2012
Messages: 1

Re: [Héritage de table BDD]Comment procedez-vous ?

Pareil ! je cherche exactement la même chose ces derniers jours !

avez-vous des mots clef ? ou exemple ?

car je n'arrive pas a représenter sa correctement a la fois en BDD et avec ZF 1;

Hors ligne

 

#9 29-10-2012 18:43:11

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [Héritage de table BDD]Comment procedez-vous ?

Je ne sais pas pour Zend à proprement parler, mais l'héritage au niveau de Doctrine est implémenté en utilisant un discriminant. Si on a une classe "User", et deux classes "Admin", "Guest" qui héritent de user, la table "User" dispose d'un discriminant qui vaut soit "admin" ou soit "guest", par exemple. Puis si on demande un "Admin", Doctrine fait une jointure au niveau du discriminant.

Après au niveau de Zend\Db je ne sais pas trop, je sais qu'il existe un hydrateur spécialisé qui permet de gérer de manière quasi-automatique les relations entre des entités. Mais Zend\Db a l'air relativement extensible, ça doit être plutôt simple d'ajouter ce cas d'utilisation.

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