我正在尝试使用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)
答案 0 :(得分:1)
你的其他两张桌子是否已经存在?
也许您也可以先尝试创建'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数据库或其他任何你正在使用的数据库上运行之前。