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.
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 ... –
Vous ne comprenez pas .. je veux dire créer le schéma YAML à partir de la BD, pas les modèles directement. – prodigitalson
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. –