2009-10-25 3 views
0

В PHP Doctrine можно создать один класс миграции, который создает таблицу и создает внешний ключ в этой таблице? По некоторым причинам, я не могу получить внешний ключ для работы ...Перемещение внешней миграции 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') 
    } 
} 

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

ответ

0

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

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

0

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

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

0

вам нужно добавить индекс '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'); 
    } 
} 
+0

Насколько я знаю, Doctrine автоматически создает индекс. Мне никогда не приходилось создавать индекс перед добавлением внешнего ключа. Я предполагаю, что у меня была другая проблема, когда поля не были идентичными или данные были неправильными в таблице или что-то в этом роде. С тех пор мне удалось создать таблицу и внешний ключ в одном классе миграции ... проблема была решена, и ответ на мой вопрос «да, мы можем!». :) – Ofir

Смежные вопросы