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

Était-ce utile?

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');
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top