Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-08-2010 10:43:02

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Integration Doctrine 2 : problème création mapping

Bonjour,
Dans le cadre d'un projet, j'ai décidé de me lancer sur Doctrine 2.
J'ai réussi à l'intégrer partiellement à Zend. La ligne de commande marche et j'arrive à interroger la base de donnée.
Le seul problème vien lors de la génération de mes différentes entity, proxies, ...

Avant, sous Doctrine 1.X, nous pouvions générer, à partir de notre BDD, les fichiers YML et les classes métier.

Maintenant, avec Doctrine 2, nous devons générer les entities à partir de fichiers de mapping (métadata en YML, XML, ...). Le problème, c'est que ces fichiers ne peuvent être générer à partir de la BDD avec doctrine 2 (enfin j'ai rien trouvé).

J'ai donc créer des fichiers YML de la BDD avec mysql Workbench. Le souci, c'est que ces fichiers ne sont pas compatibles Doctrine 2.

Heureusement, la commande doctrine a un utilitaire pour convertir le YML. Et là, cerise sur le gâteau, je tombe sur un énorme problème. J'ai beau écumer la doc, les aides, les forums, je ne trouve rien.

Ayant vu que certains se sont tournés aussi vers Doctrine 2 sous Zend ou sous autre chose, vous pourrez surement me dire d'où cela peut provenir.

Mon souci c'est que lors de la conversion, j'ai le message d'erreur suivant :

Code:

Could not map doctrine 1 type 'float'!

Voici la partie de mon YML qui a l'air de poser problème :

Code:

tVenue:
  tableName: t_venues
  columns:
    ven_id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    ven_title:
      type: string(250)
      default: null
    ven_adress:
      type: clob(65535)
      notnull: true
    ven_zip:
      type: string(10)
      notnull: true
    cit_id:
      type: integer(4)
      notnull: true
    cit_label:
      type: string(150)
      notnull: true
    ven_lat:
      type : float
      default: null
    ven_long:
      type : float
      default: null
  indexes:
    cit_id:
      fields: [cit_id]
  options:
    charset: utf8
    collate: utf8_unicode_ci

J'ai beau regarder, cette déclaration est bien conforme doctrine 1. Je pourrai faire tout le YML à la main mais j'ai plus d'une cinquantaine de table à gérer et ce serait vraiment fastidieux.

Si quelqu'un sait résoudre mon problème de conversion ou, si quelqu'un sait comment générer le YML Doctrine 2.0 à partir d'une BDD mysql, je suis preneur.

EDIT :

J'ai réussis à créer mes fichiers YML en modifiant float par decimal.
Maintenant le souci c'est que je n'arrive pas à ajouter de préfixes aux entités lors de la génération.

Par exemple, je voudrai leur ajouter le préfixe Models_ afin de les placer dans mon dossier models et de n'avoir aucun problème avec Zend.

Dernière modification par throrin19 (04-08-2010 12:00:31)

Hors ligne

 

#2 06-08-2010 17:25:27

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Integration Doctrine 2 : problème création mapping

Hello,

Si tu veux faire du reverse engineering avec Doctrine, j'ai posté un exemple sur l'IT de Doctrine (http://www.doctrine-project.org/jira/browse/DDC-616), c'est destiné à des tests avec Oracle mais l'idée est là et de mémoire je n'avais pas de problèmes avec MySQL.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 06-08-2010 17:42:26

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Integration Doctrine 2 : problème création mapping

merci beaucoup car avec Doctrine 1, la commande le permettait nativement hors là, j'ai dû aller sous mysql worbench, générer les yml compatible doctrine 1 et les convertir. Après j'ai un problème avec l'intégration des entités dans Zend. Il ne me les trouve pas car elles ne s'appellent pas Models_*.

J'ai essayé en les renommant directement dans les yml mais rien à faire sad
Je vais voir comment faire le mix namespace php5.3 avec.

Et encore merci smile

Hors ligne

 

#4 12-08-2010 09:05:42

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Integration Doctrine 2 : problème création mapping

Ah, j'ai un souci avec ton script sad

Je viens d'essayer de générer ma base et j'obtiens cette erreur:

Code:

PHP Fatal error:  Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Property "teapHeaderpol" in "TTemplatesAppli" was already declared, but it must be declared only once' in /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/MappingException.php:156
Stack trace:
#0 /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php(1064): Doctrine\ORM\Mapping\MappingException::duplicateFieldMapping('TTemplatesAppli', 'teapHeaderpol')
#1 /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php(1017): Doctrine\ORM\Mapping\ClassMetadataInfo->_storeAssociationMapping(Object(Doctrine\ORM\Mapping\OneToOneMapping))
#2 /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php(1040): Doctrine\ORM\Mapping\ClassMetadataInfo->mapOneToOne(Array)
#3 /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php(136): Doctrine\ORM\Mapping\ClassMetadataInfo->mapManyToOne(Array)
#4 /var/www/goomeoevent/private/library/Doctrine/ORM/Mappin in /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/MappingException.php on line 156

Doctrine\ORM\Mapping\MappingException: Property "teapHeaderpol" in "TTemplatesAppli" was already declared, but it must be declared only once in /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/MappingException.php on line 156

Call Stack:
    0.0005     658288   1. {main}() /var/www/goomeoevent/private/application/bin/doctrine-bd-to-mapper.php:0
    0.0327    4632280   2. Doctrine\ORM\Mapping\ClassMetadataFactory->getAllMetadata() /var/www/goomeoevent/private/application/bin/doctrine-bd-to-mapper.php:37
    0.2838    7611896   3. Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor() /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php:102
    0.2838    7611896   4. Doctrine\ORM\Mapping\ClassMetadataFactory->_loadMetadata() /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php:155
    0.2838    7617360   5. Doctrine\ORM\Mapping\Driver\DatabaseDriver->loadMetadataForClass() /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php:256
    0.2891    7724128   6. Doctrine\ORM\Mapping\ClassMetadataInfo->mapManyToOne() /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php:136
    0.2891    7724128   7. Doctrine\ORM\Mapping\ClassMetadataInfo->mapOneToOne() /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php:1040
    0.2892    7730552   8. Doctrine\ORM\Mapping\ClassMetadataInfo->_storeAssociationMapping() /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataInfo.php:1017

voici la déclaration de cette table

Code:

DROP TABLE IF EXISTS `t_templates_appli`;
CREATE TABLE IF NOT EXISTS `t_templates_appli` (
  `teap_id` int(11) NOT NULL AUTO_INCREMENT,
  `evt_id` int(11) NOT NULL,
  `teap_ongletcode` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  `teap_ongletbck` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `teap_headerbck` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `teap_contentbck` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `teap_onglettxtcolor` varchar(9) COLLATE utf8_unicode_ci NOT NULL,
  `teap_contenttxtcolor` varchar(9) COLLATE utf8_unicode_ci NOT NULL,
  `teap_headertxtcolor` varchar(9) COLLATE utf8_unicode_ci NOT NULL,
  `teap_headerpol` int(11) NOT NULL,
  `teap_contentpol` int(11) NOT NULL,
  PRIMARY KEY (`teap_id`),
  KEY `evt_id` (`evt_id`),
  KEY `teap_headerpol` (`teap_headerpol`),
  KEY `teap_contentpol` (`teap_contentpol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Là je ne vois pas d'où ça peut venir. Il parle d'un problème de redéclaration hors, il est bien présent qu'une fois.

Hors ligne

 

#5 16-08-2010 15:36:46

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Integration Doctrine 2 : problème création mapping

Je reviens encore pour dire où j'en suis. J'ai pris la dernière version disponible via le GIT de doctrine. Maintenant j'obtiens une autre erreur qui me semble plus juste :

Code:

PHP Fatal error:  Uncaught exception 'InvalidArgumentException' with message 'ManyToMany table 'a_users_usertype_events' with more or less than two foreign keys are not supported by the Database Reverese Engineering Driver.' in /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php:99
Stack trace:
#0 /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php(270): Doctrine\ORM\Mapping\Driver\DatabaseDriver->reverseEngineerMappingFromDatabase()
#1 /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php(101): Doctrine\ORM\Mapping\Driver\DatabaseDriver->getAllClassNames()
#2 /var/www/goomeoevent/private/application/bin/doctrine-bd-to-mapper.php(37): Doctrine\ORM\Mapping\ClassMetadataFactory->getAllMetadata()
#3 {main}
  thrown in /var/www/goomeoevent/private/library/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php on line 99

En un mot, doctrine 2 ne permet plus le reverse engineering sur des bases complexes. Pourtant doctrine 1 le permettai. C'est bien dommage et surtout bien lourd de devoir se farcir une cinquantaine de tables à la main.

Il n'y a pas encore de méthode permettant dze générer des YML directement disponibles pour doctrine 2 via mysql workbench ou autre?

Sinon à par ça je pense l'avoir parfaitement intégré. Seule cette partie me bloque

Hors ligne

 

#6 16-08-2010 19:26:13

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Integration Doctrine 2 : problème création mapping

Hello,

Ce cas ne sera pas corrigé dans Doctrine 2.0 mais est prévu pour Doctrine 2.1. B. Eberlei a déjà commencé le travail sur une branche => http://github.com/doctrine/doctrine2/tree/DDC-117 , il m'a demandé de tester mais j'avoue que je n'ai pas encore jeté un oeil. Il m'a conseillé de prendre exemple sur le test associé à ce commit : http://github.com/doctrine/doctrine2/co … 6eea#L6R94

Bon courage wink


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#7 16-08-2010 19:48:02

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Integration Doctrine 2 : problème création mapping

merci beaucoup. Je pense commencer sur doctrine 1 et quand la 2.1 sera sortie, je migrerai smile

Hors ligne

 

#8 20-08-2010 20:27:47

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Integration Doctrine 2 : problème création mapping

Me revoilà pour annoncer que ça y est, j'ai réussi à faire ce que je voulais (à par le many2many). J'ai accès à mes entities et mes proxies (il me manquait que l'ajout des ressources dans le bootstrap).
Je test dès que je peux la branche que tu m'as passé mickaelkael afin de voir si le many2many marche enfin big_smile

Hors ligne

 

#9 02-09-2010 11:12:40

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Integration Doctrine 2 : problème création mapping

Je me relance, désolé pour le triple post mais un edit l'aurai pas affiché.

J'ai réussi à intégrer doctrine2, tout marche bien ou presque. Je n'ai pas généré mes entities, je les ai codées moi même à partir de ma base.

Sauf que voilà, je suis face à un problème avec certaines many-to-many et aucun exemple n'est présent dans la documentation ni ailleurs sur le net.

Pour faire simple j'ai 3 tables: Langue, langueoption, et Option.

La table langueOption fait le lien entre la table langue et option. Elle a donc 2 colonnes composant une seule clé primaire : lan_id et opt_id. Par contre, elle a d'autres colonnes pour me permettre de traduire le libelle des options en fonction de la langue.

Doctrine dit ceci sur la documentation :

Why are many-to-many associations less common? Because frequently you want to associate additional attributes with an association, in which case you introduce an association class. Consequently, the direct many-to-many association disappears and is replaced by one-to-many/many-to-one associations between the 3 participating classes.

Ce qui veut dire qu'au lieu d'avoir mes entités Langue et Option, je devrai avoir en plus une entité assoc : LangueOption.

Je trouve ça totalement illogique, autant resté sur du Zend_Db pour arriver au même résultat et, même pour ça, Doctrine ne donne aucun exemple.

Si quelqu'un peut m'aider ou m'expliquer cela.
Merci

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