Pergunta

Em PHP Doutrina, é possível a criação de uma migração de classe que cria uma tabela e cria uma chave estrangeira na mesa? Por alguma razão, eu não posso pegar a chave estrangeira para o trabalho ...

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

Obrigado, Ofir

Foi útil?

Solução 3

Para responder a minha própria pergunta, a resposta é sim.

Você tem que verificar se tudo está em ordem, porém, o que significa que as colunas devem ser idênticos (tipo, comprimento, etc.) e também que a chave estrangeira é uma chave única em sua própria mesa (eu não lembre-se, mas talvez ele também deve ser a primeira coluna).

Outras dicas

Isto pode não ser uma resposta definitiva, mas tenho notado que se você usar o CLI para criar as migrações a partir de um esquema existente, Doctrine irá gerar uma migração em separado para criar cada tabela e, em seguida, gerar uma migração final única que configura todas as relações chave estrangeira.

Gostaria de tentar mover a criação de chave estrangeira em uma migração separada e ver se isso funciona.

você precisa adicionar o índice 'foreign_key_name' antes de adicionar a restrição de chave estrangeira sobre ele. assim:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top