Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Dans le cadre d'un projet, j'aimerais pouvoir créer une base de données à souhait. Quelle est la meilleure façon de procéder ? J'aimerais utiliser une fonction qui s'occupe de sa création (en fonction du type de driver selectionné, car j'utilise MySQL & PostgreSql)
J'ai trouvé dans la librairie de doctrine une fonction mais celle-ci est pour MySQL :
"doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php"
public function getCreateDatabaseSQL($name) { return 'CREATE DATABASE ' . $name; }
Cette fonction existe aussi pour la librairie PostgreSQL (fichier PostgreSqlPlatform.php) mais j'aimerais ne pas à utiliser de switch case..
Merci par avance
Hors ligne
Salut, ça sera pareil sur n'importe quel ORM il y a une couche d'abstraction au niveau applicatif. Normalement si tu regardes bien tu dois avoir une interface qui est implémenté par toutes les classes xxxPlatform.php et derrière l'implémentation est différente suivant le SGBD. L'ORM sélectionnera la bonne classe en fonction du drivers.
Pour ton problème tu n'as pas 36 solutions je pense. Tu peux faire une classe qui saura faire la différence entre les drivers utilisés et se chargera d'appeler la bonne classe suivant la base mais ça implique une notion de "switch".
Hors ligne
Donc si j'ai bien compris je fais une classe dans laquelle:
- Je cherche le driver utilisé
- Je fais un switch en fonction du driver utilisé, pour ensuite instancié soit MySQL à travers la fonction getCreateDatabaseSQL de la classe MySqlPlatform, soit PostgreSQL à travers la même fonction mais de la classe PostgreSqlPlatform ? Si oui je ne comprends pas l’intérêt de doctrine?
Merci
Hors ligne
Explique mieux ton problème parce que là je pense que j'ai pas tout compris ... Normalement Doctrine fera la sélection tout seul en fonction du drivers que tu utilises mais c'est en rapport avec ta configuration et dans cette configuration tu lui passes les paramètres de la connexion à la base. Or toi si j'ai bien compris tu veux en créer une nouvelle donc je sais pas comment Doctrine peut savoir quel SGBD tu utilises puisque tu n'as pas de base de configuré.
Hors ligne
J'ai créé un module Installation, dans ce module l'utilisateur va remplir un formulaire qui va permettre de définir:
- le type de driver utilisé (MySQL ou PostgreSQL)
- les informations de connexions ( base de données, login, mot de pass)
En gros il va remplir ce tableau :
'doctrine' => array( 'connection' => array( 'orm_default' => array( 'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', 'params' => array( 'host' => 'localhost', 'port' => '3306', 'user' => 'admin', 'password' => '', 'dbname' => 'prompc', 'charset' => 'utf8' ) ) ) ),
Une fois les informations remplis, il faut que créer la base de données, et les entities.
Et c'est à ce niveau que je bloque.
Dernière modification par adloiseau (19-02-2013 17:04:20)
Hors ligne
Ben normalement tu as le drivers à cet endroit donc tu sais quelle classe appeler. Je pense pas que l'EM ai accès à la création de base
Hors ligne
J'ai une classe qui me permet de créer mes entities, j'utilise la fonction create() de Doctrine/ORM/EntityManager :
use Zend\ServiceManager\ServiceLocatorAwareInterface, Zend\ServiceManager\ServiceLocatorInterface, Doctrine\ORM\EntityManager; abstract class Entity implements ServiceLocatorAwareInterface, DirectInterface { /** * @var EntityManager */ protected $em; protected $services; public function setEntityManager(EntityManager $em) { $this->em = $em; } public function getEntityManager() { if(null === $this->em) { $this->em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); } return $this->em; } public function setServiceLocator(ServiceLocatorInterface $serviceLocator) { $this->services = $serviceLocator; } public function getServiceLocator() { return $this->services; } public function create($entity, $data) { ... };
mais pour la création de la base de données je ne sais pas j'ai trouvé la fonction getCreateDatabaseSQL($database) de la classe AbstractPlatform de Doctrine/DBAL
Dernière modification par adloiseau (19-02-2013 17:26:22)
Hors ligne