使用Phinx添加外键

时间:2015-06-16 03:33:50

标签: php mysql phinx

我正在尝试使用Phinx迁移将外键添加到表中。我的目的是创建一个表('sales_order_attachment')并添加两个外键。没有太多的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)  

3 个答案:

答案 0 :(得分:1)

你的其他两张桌子是否已经存在?

  • file_upload
  • sales_order的

也许您也可以先尝试创建'sales_order_attachment'表,然后在单独的步骤中添加外键。

此致

罗布

答案 1 :(得分:1)

我遇到了同样的问题,这是因为没有正确设置外键上的“删除”和“更新”选项。 尝试:

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

答案 2 :(得分:1)

我使用phinx,但我发现ORM包装无用。原因是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在sqlite数据库或其他任何你正在使用的数据库上运行之前。