Domanda

In PHP Doctrine, è possibile creare una classe di migrazione che crea una tabella e crea una chiave esterna su quella tabella? Per qualche motivo, non riesco a far funzionare la chiave esterna ...

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')
    }
}

Grazie, Ofir

È stato utile?

Soluzione 3

Per rispondere alla mia domanda, la risposta è sì.

Devi controllare che tutto sia in ordine, tuttavia, nel senso che le colonne dovrebbero essere identiche (tipo, lunghezza, ecc.) e anche che la chiave esterna è una chiave univoca nella sua tabella (non ricorda, ma forse dovrebbe essere anche la prima colonna).

Altri suggerimenti

Questa potrebbe non essere una risposta definitiva, ma ho notato che se si utilizza l'interfaccia della riga di comando per creare migrazioni da uno schema esistente, Doctrine genererà una migrazione separata per creare ogni tabella e quindi genererà una singola migrazione finale che imposta tutte le relazioni con le chiavi esterne.

Vorrei provare a spostare la creazione della chiave esterna in una migrazione separata e vedere se funziona.

è necessario aggiungere l'indice 'nome_chiave_estero' prima di poter aggiungere il vincolo di chiave esterna su di esso. così:

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');
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top