2015-06-16 4 views
1

Я пытаюсь добавить внешние ключи в таблицу, используя миграцию Phinx. Я намерен создать таблицу ('sales_order_attachment') и добавить два внешних ключа. Там не слишком много документации по Phinx, поэтому я не нашел ответа в Интернете или по-разному (пока). Что я здесь делаю неправильно? Обе таблицы и ключи указывают, что миграция существует.Добавление внешнего ключа с помощью Phinx

миграции:

public function up() 
{ 
    $table = $this->table('sales_order_attachment', array('id' => 'sales_order_attachment_id')); 
    $table->addColumn('file_upload_id', 'integer') 
     ->addForeignKey('file_upload_id', 'file_upload', 'id'); 
    $table->addColumn('sales_order_id', 'integer') 
     ->addForeignKey('sales_order_id', 'sales_order', 'id') 
     ->save(); 
} 

public function down() 
{ 
    $this->table('sales_order_attachment')->drop(); 
} 

Ошибка:

[PDOException]                        
SQLSTATE[HY000]: General error: 1005 Can't create table 'table.sales_order_attachment' (errno: 150) 
+0

Вы первый, кто старше года, чтобы добавить вопрос к этому тегу. Теперь есть 2. Посмотрите, где я собираюсь с этим? – AsConfused

+0

если вы имеете в виду тег phinx, то другой вопрос задавали месяц назад. и учитывая, что текущая версия 0.4.4, я предполагаю, что она довольно новая. –

+0

Я подразумеваю, что не буду использовать его – AsConfused

ответ

1

ли ваши две другие таблицы уже существуют?

  • file_upload
  • sales_order

Может быть, вы могли бы также попробовать создать таблицу '' sales_order_attachment первой затем добавить внешние ключи в отдельном шаге.

С уважением,

Роб

1

У меня была такая же проблема, и она была вызвана не устанавливая «Удалить» и опции «Обновить» на внешних ключей должным образом. Try:

public function up() 
{ 
    $table = $this->table('sales_order_attachment', array('id' => 'sales_order_attachment_id')); 
    $table->addColumn('file_upload_id', 'integer', array('limit'=>10)) 
     ->addForeignKey('file_upload_id', 'file_upload', 'id', array('delete'=>'RESTRICT', 'update'=>'CASCADE')); 
    $table->addColumn('sales_order_id', 'integer', array('limit'=>10)) 
     ->addForeignKey('sales_order_id', 'sales_order', 'id', array('delete'=>'RESTRICT', 'update'=>'CASCADE')) 
     ->save(); 
} 

Я использую Phinx 0.5.3 & тонкий 3,0

1

Я использую phinx, но я обнаружил, что ОРМ обертывание быть бесполезным. Причина в том, что ORM, как правило, очень трудно отлаживать.

Попробуйте вместо этого, (при условии, что это MySQL, запустить его в любой базе данных вам нужно):

public function up() 
    { 
     $exists = $this->hasTable('sales_order_attachment'); 
     if (!$exists) { 
      $this->execute("CREATE TABLE `sales_order_attachment` (
          `sales_order_attachment_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
          `minimum_quantity` int(10) unsigned NOT NULL DEFAULT '0', 
          PRIMARY KEY (`sales_order_attachment_id`), 
          CONSTRAINT `sales_order_id` FOREIGN KEY (`sales_order_id`) REFERENCES `sales_order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"); 
     } 
    } 
    public function down() 
    { 
     $exists = $this->hasTable('sales_order_attachment'); 
     if ($exists) { 
      $table = $this->table('sales_order_attachment'); 
      $table->drop(); 
     } 
    } 

Я нашел, что это самый простой для отладки и использования. Единственная проблема - если вы используете несколько разных баз данных, вам нужно обновить файл phinx.yml, чтобы указать на другую папку сценариев, например. %% PHINX_CONFIG_DIR %%/sqlite_scripts перед запуском в SQL-базах данных или в любом другом месте, которое вы используете.

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