如何解决反向迁移/删除自定义索引名称laravel迁移的外键
所以我有这个迁移
public function up()
{
Schema::table('xxx',function (Blueprint $table) {
$table->foreign('aaa','bbb') // handle identifier name too long
->references('id')->on('aaa_table')->onDelete('cascade')->onUpdate('cascade');
});
}
我想要创建down()
函数/进行反向迁移以删除此外键。
我在这里尝试过的事情:
public function down()
{
Schema::table('xxx',function (Blueprint $table) {
// implement one line of all 4 possibilities
$table->dropForeign(['aaa']);
$table->dropForeign(['bbb']);
$table->dropForeign(['aaa'],'bbb');
$table->dropForeign(['bbb'],'aaa');
});
}
当我回滚此迁移文件时,所有人都给出相同的错误
SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'zzz'; check that column/key exists
数据库条件仍然干净,没有插入任何数据(行)。如果我没有在foreign
中将自定义名称分配给第二个参数并且使用短名称(不警告标识符名称太长的情况),那么反向迁移将顺利进行。
解决方法
或者,您可以传递一个包含以下列名称的数组: 持有dropForeign方法的外键。该数组将是 使用由使用的约束名称约定自动转换 Laravel的架构生成器:
$ table-> dropForeign(['user_id']);
对于我们的情况,应该是:
$table->dropForeign(['aaa','bbb']);
,但由于以下原因,这不适用于您的情况:
方法foreign采用两个参数,一个作为列名,另一个作为外键名。
在您的情况下,您将一列用于关联,将另一列用于命名!
$table->foreign('aaa','bbb')
应该是:
$table->foreign(['aaa','bbb'])
或者,您也可以像这样:
$table->foreign(['aaa','bbb'],'my_foreign_name')....
和down()方法中
$table->dropForeign('my_foreign_name');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。