2010-10-26 4 views
0

Lorsque deux modèles sont liés entre eux, Doctrine génère automatiquement des contraintes de clé étrangère dans la base de données MySQL. Le comportement par défaut pour onDelete et onUpdate RESTRICT, mais peut également être défini sur SET NULL ou CASCADE.Comment comprendre les contraintes de clé étrangère d'une table MySQL en utilisant Doctrine 1.1?

Maintenant, je veux créer un diff de migration à partir d'une base de données existante par rapport à un fichier YAML. Pour ce faire, j'utilise la fonction Doctrine::generateModelsFromDB(). J'utilise un verso surchargé de Doctrine_Migration_Diff pour faire le travail différentiel pour moi, qui s'occupe des noms de classes non-assortis, des longueurs de champs MySQL etc. Il fait bien toutes les choses, mais il y a un problème avec ces contraintes de clés étrangères.

Lorsque je crée des classes PHP à partir d'une base de données MySQL, il semble que Doctrine ne définit pas les valeurs appropriées 'onDelete' et 'onUpdate'. Quand j'essaye alors de différencier ces classes de PHP contre des classes qui ont l'ensemble 'onDelete' et/ou 'onUpdate', Doctrine essaye d'ajouter une nouvelle clé étrangère qui existe déjà, et MySQL échoue.

J'ai contourné temporairement cette erreur en ignorant manuellement toutes les clés étrangères modifiées dans mon Doctrine_Migration_Diff surchargé, mais ce n'est vraiment pas une solution. Ce que je veux: si Doctrine pense qu'une nouvelle clé étrangère doit être ajoutée, le hasard est déjà là, et ce à quoi ses comportements onDelete et onUpdate sont fixés. Comment puis-je vérifier cela, si j'ai le nom du champ local et le nom du champ étranger?

P.S. Si quelqu'un est certain que cela a été corrigé dans Doctrine 1.2 (dont je doute), s'il vous plaît ne me conseille pas de mettre à niveau. J'ai des raisons précises de travailler avec 1.1 dans ce cas, mais c'est une histoire différente. Je préférerais être pointé dans la direction de quel changement de code fourni cette correction, qui pourrait être un pas de plus vers une solution de contournement.

Répondre

0

Pour répondre à ma propre question: J'ai regardé dans le code source Doctrine pendant un certain temps, et j'ai découvert que l'importateur MySQL n'a pas de fonctionnalité pour le faire. En d'autres termes, c'est impossible sans étendre Doctrine vous-même.

0

Eh bien, je n'ai jamais eu ce problème. Mais j'utilise généralement Doctrine avec Symfony et ils ont peut-être personnalisé les outils de migration au-delà de leur connexion à l'interface Symfony CLI.

Si j'étais vous, je voudrais générer un nouveau schmea à partir de la base de données, puis générer la migration à partir du schéma mis à jour (compare le schéma aux modèles je pense). Puis régner mes modèles après.

Toutefois, je recommande de rendre le schéma faisant autorité. Si vous devez utiliser une base de données héritée, générez votre schéma à partir de la base de données lorsque vous démarrez. Ensuite, tous les changements de DB après cela, faites au schéma, puis migrer en utilisant schmea/models.

+1

Sauf si je ne comprends pas la réponse correctement, c'est exactement ce que je fais et ce qui pose problème: lors de la génération d'un schéma à partir de la base de données, les informations vitales sont perdues. Mon flux de travail: 1. Créer un schéma (= classes PHP dans un emplacement temporaire?) En utilisant generateModelsFromDB; 2. Créez un schéma à partir de YAML; 3. Comparez les deux schémas (en utilisant ma classe Diff surchargée) et 4. Appliquez les migrations à la base de données. Si je pouvais vérifier manuellement l'existence de contraintes FK dans la base de données, je pourrais probablement utiliser cela en surchargeant les classes correctes ... –

+1

Vous ne comprenez pas .. je veux dire créer le schéma YAML à partir de la BD, pas les modèles directement. – prodigitalson

+0

Désolé pour la réponse tardive. Si je crée YAML à partir de la base de données, le comportement onDelete d'origine est toujours introuvable. –

Questions connexes