Doctrine migration clés étrangères
-
06-07-2019 - |
Question
Dans PHP Doctrine, est-il possible de créer une classe de migration qui crée une table et crée une clé étrangère sur cette table? Pour une raison quelconque, je ne parviens pas à faire fonctionner la clé étrangère ...
class Migration_001 extends Doctrine_Migration_Base {
public function up() {
$this->createTable('table_name', array(...))
$this->createForeignKey('table_name', 'foreign_key_name', array(...))
}
public function down() {
$this->dropForeignKey('table_name', 'foreign_key_name')
$this->dropTable('table_name')
}
}
Merci, Ofir
La solution 3
Pour répondre à ma propre question, la réponse est oui.
Vous devez toutefois vérifier que tout est en ordre, ce qui signifie que les colonnes doivent être identiques (type, longueur, etc.) et que la clé étrangère est une clé unique dans sa propre table (je ne le fais pas). souvenez-vous, mais peut-être que cela devrait aussi être la première colonne).
Autres conseils
Cela peut ne pas être une réponse définitive, mais j'ai remarqué que si vous utilisez la CLI pour créer des migrations à partir d'un schéma existant, Doctrine générera une migration distincte pour créer chaque table, puis une seule migration finale qui sera configurée. toutes les relations de clé étrangère.
Je voudrais essayer de déplacer la création de la clé étrangère dans une migration séparée et voir si cela fonctionne.
vous devez ajouter l'index 'foreign_key_name' avant de pouvoir y ajouter la contrainte de clé étrangère. alors:
class Migration_001 extends Doctrine_Migration_Base {
public function up() {
$this->createTable('table_name', array(...));
$this->addIndex('table_name', 'foreign_key_name', array(
'fields'=>array('local_id')
));
$this->createForeignKey('table_name', 'foreign_key_name', array(
'local' => 'local_id',
'foreign' => 'id',
'foreignTable' => 'foreign_table',
'onDelete'=>'CASCADE'
));
}
public function down() {
$this->dropForeignKey('table_name', 'foreign_key_name');
$this->removeIndex('table_name', 'foreign_key_name');
$this->dropTable('table_name');
}
}