首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Phinx添加外键

使用Phinx添加外键
EN

Stack Overflow用户
提问于 2015-06-16 11:33:50
回答 3查看 3.2K关注 0票数 1

我正在尝试使用Phinx迁移将外键添加到表中。我的目的是创建一个表('sales_order_attachment')并添加两个外键。没有太多的Phinx文档,所以我还没有在互联网上或通过修补找到答案。我在这里做错了什么?迁移指向的表和键都存在。

迁移:

代码语言:javascript
复制
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();
}

错误:

代码语言:javascript
复制
[PDOException]                                                                                            
SQLSTATE[HY000]: General error: 1005 Can't create table 'table.sales_order_attachment' (errno: 150)  
EN

回答 3

Stack Overflow用户

发布于 2015-06-17 15:05:11

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

  • file_upload
  • sales_order

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

致以敬意,

抢夺

票数 1
EN

Stack Overflow用户

发布于 2016-04-07 21:05:23

我也遇到了同样的问题,这是由于没有正确设置外键的'delete‘和'update’选项造成的。尝试:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2016-06-17 03:33:24

我使用的是phinx,但是我发现ORM包装是无用的。原因是ORM往往很难调试。

尝试这样做(假设这是MySQL,在您需要的任何数据库中运行它):

代码语言:javascript
复制
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_DIR%%/ sqlite _ scripts,然后在sqlite数据库或任何你正在使用的东西上运行它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30858321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档