1

我正在尝试使用 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)  
4

3 回答 3

1

您的其他两个表是否已经存在?

  • 上传文件
  • 销售订单

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

问候,

于 2015-06-17T07:05:10.523 回答
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 数据库或任何其他数据库上运行它之前使用。

于 2016-06-16T19:33:23.853 回答
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 & slim 3.0

于 2016-04-07T13:05:22.693 回答