Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'aimerai savoir si - en utilisant doctrine 2.x - je peux générer automatiquement des modèles en fonction des bases de données ? Actuellement j'utilise Zend_Db pour chaque table mais j'avoue que c'est redondant car je dois manuellement créer des méthodes CRUD pour chaque table. Exemple je fais une recherche sur un nom d'utilisateur, je vais devoir faire une methode searchByUserName avec une requete SQL de Zend_Db
Sur Symphony j'avais lu qu'il était possible de faire un mapping objet assez puissant qui permet de faire une requete SQL en tappant les mots clés genre searchByFieldAndField
C'est possible ou doctrine dans mon cas ne servira strictement à rien ?
Merci pour vos réponses
Hors ligne
Bonjour,
Pour répondre à ta question, surement ! Je te dis surement car moi j'utilise la version 1.2 et je génère automatiquement mes modèles. J'ai pas encore fait le saut vers 2.x car le saut semble assez grand.
Dans doctrine 1.2, c'est la fonction "Doctrine_Core::generateModelsFromDb" qui me permet de faire ça.
Cherche l'équivalent pour 2.x
Hors ligne
J'ai trouvé une réponse ici
http://stackoverflow.com/questions/4065 … -db-schema
Hors ligne
Selon la version que tu utilises de Doctrine 2.0x un outil est mis à disposition en cli.
http://www.doctrine-project.org/docs/or … ngineering
En revanche, comme le mentionne le commentaire sur SO, je te déconseille de le faire, tu dois penser ORM et non pas SGBR, construire tes entités ainsi risque de corrompre l'utilité d'un ORM (qui n'est pas la même qu'un DAL).
D'autant plus que dans le cas de relation complexe, tu n'auras simplement le résultat souhaité car Doctrine 2 s'appuie sur les metadata de ta BDD et non pas sur la logique inhérente à celle-ci.
Hors ligne
Excuses moi bgy mais je n'ai pas bien compris ton post. Doctrine 2.x n'est pas adapté dans mon cas ? C'est ça ?
Hors ligne
xenesis a écrit:
Excuses moi bgy mais je n'ai pas bien compris ton post. Doctrine 2.x n'est pas adapté dans mon cas ? C'est ça ?
Oui et non, ce que je voulais surtout dire c'est que quand tu travailles avec un ORM tu dois d'abord penser Object, seulement ensuite tu réfléchis aux optimisations (pour des questions de performances principalement).
Le problème en fonctionnant ainsi est que t'accroches à un modèle relationnel, et ce n'est probablement pas ce que tu cherches si tu veux utiliser un ORM.
Les relations entre objects ne sont pas physiquement ni logiquement les même que dans SGBDR.
ORM = Object Relational Mapping
DAL = Database Abstraction Layer
Si tu veux utiliser un ORM, pense Objet, ça me parait essentiel, j'ai presque envie de dire "oublie ce que tu as appris sur les bases de données" c'est vraiment une façon différent de travailler avec tes models.
Par exemple lorsque tu utilises le DQL (Doctrine Query Language), même si ça ressemble à du SQL, ça n'a rien à voir. Tu t'en rendras compte très vite lorsque tu feras des jointures par exemple.
Tu peux utiliser l'outil de reverse engineering pour avoir une "base" mais je te conseille tout de même de faire ce travail à la main et de laisser Doctrine regénéré ton schema de base de données (ensuite tu pourras alors retravailler schema en fonction de tes problématiques de performances).
J'espère que ça répond à ta question.
Hors ligne
Ce que je souhaitais surtout, c'est ne pas avoir à réécrite un modèle pour gérer le CRUD de chaque table dans la base de données. Exemple :
- Table users, avoir un fichier model qui me permette de faire searchUserById($id), ou searchUserByName
- Table commandes, même chose, getCommandeById($id)
En gros utiliser une appellation magique __getter __setter qui dira a doctrine de prendre tel champs dans telle table sans avoir à refaire la fonction à chaque fois et pour chaque table. J'ai vu que symfony pouvait faire quelque chose de ce type, tout du moins sous propel, avec Doctrine je sais pas.. c'est la première fois que je le manipule..
Hors ligne
Tu as des méthodes magiques similaires dans Doctrine 2, cependant étant donné l'utilisation d'un pattern différent, ces méthodes vont se trouver dans les Repositories. Par défault Doctrine 2 te fournit 4 méthodes :
[lang=php] find($id); findAll(); findOneBy(array('status' => 'active')); findBy(array('status' => 'active'));
Tu peux également utiliser des méthodes magiques du type
[lang=php] findOneByStatus('active');
Je t'invite à jeter un oeil à la documentation officiel ainsi qu'à la classe Doctrine\Orm\EntityRepository
Pour les cas plus complexes, tu devras implémenter toi-même de nouvelles méthodes. Rien ne t'empêche également de créer ton propre AbstractRepository que tu étendras pour l'ensemble de ton domaine.
Hors ligne