Вопрос

В PHP Doctrine возможно ли создать один класс миграции, который создает таблицу и создает внешний ключ для этой таблицы?По какой-то причине я не могу заставить внешний ключ работать ...

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

Спасибо, Офир

Это было полезно?

Решение 3

Чтобы ответить на мой собственный вопрос, ответ - да.

Однако вам нужно проверить, что все в порядке, это означает, что столбцы должны быть идентичны (тип, длина и т.д.), А также что внешний ключ является уникальным ключом в его собственной таблице (я не помню, но, возможно, это также должен быть первый столбец).

Другие советы

Возможно, это не окончательный ответ, но я заметил, что если вы используете CLI для создания миграций из существующей схемы, Doctrine сгенерирует отдельную миграцию для создания каждой таблицы, а затем сгенерирует окончательную единую миграцию, которая устанавливает все отношения внешнего ключа.

Я бы попробовал перенести создание внешнего ключа в отдельную миграцию и посмотреть, сработает ли это.

вам нужно добавить индекс 'foreign_key_name', прежде чем вы сможете добавить к нему ограничение внешнего ключа.итак:

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');
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top