Pregunta

En PHP Doctrine, ¿es posible crear una clase de migración que cree una tabla y cree una clave externa en esa tabla? Por alguna razón, no puedo hacer que la clave externa funcione ...

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

Gracias, Ofir

¿Fue útil?

Solución 3

Para responder mi propia pregunta, la respuesta es sí.

Sin embargo, tiene que comprobar que todo está en orden, lo que significa que las columnas deben ser idénticas (tipo, longitud, etc.) y también que la clave externa es una clave única en su propia tabla (no recuerde, pero tal vez también debería ser la primera columna).

Otros consejos

Esto podría no ser una respuesta definitiva, pero me he dado cuenta de que si utiliza la CLI para crear migraciones desde un esquema existente, Doctrine generará una migración por separado para crear cada tabla y luego generará una migración única final que se configura Todas las relaciones de clave externa.

Intentaría mover la creación de la clave externa a una migración por separado y ver si funciona.

debe agregar el índice 'foreign_key_name' antes de poder agregarle la restricción de clave foránea. entonces:

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');
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top