我在从Laravel应用程序中删除一些外键时遇到问题.问题是当我尝试回滚迁移时:
php artisan migrate:rollback
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我在控制台中有错误:
[Illuminate\Database\QueryException] SQLSTATE [42000]:语法错误或访问冲突:1091无法DROP'rope_user_user_id_foreign'; 检查列/密钥是否存在(SQL:alter table
role_user
drop foreign keyrole_user_user_id_foreign
)[Doctrine\DBAL\Driver\PDOException] SQLSTATE [42000]:语法错误或访问冲突:1091无法DROP'rope_user_user_id_foreign'; 检查列/键是否存在
[PDOException] SQLSTATE [42000]:语法错误或访问冲突:1091无法DROP'rope_user_user_id_foreign'; 检查列/键是否存在
下面我展示了我的迁移类:
class UpdateRoleUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
schema::table('role_user',function(Blueprint $table){
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('role_id')->references('id')->on('roles');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign('role_user_user_id_foreign');
$table->dropForeign('role_user_role_id_foreign');
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据库表已由迁移类创建:
class CreateRoleUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('role_id')->unsigned();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('role_user');
}
}
Run Code Online (Sandbox Code Playgroud)
Kin*_*a T 10
在所有> 4.0版本的Laravel中,它允许将列名放入一个数组中,然后它将自行解析.我试图找到随附的文档,但他们似乎已将其遗漏.
在更新迁移中,请尝试以下操作:
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign(['user_id']);
$table->dropForeign(['role_id']);
});
Run Code Online (Sandbox Code Playgroud)
我刚刚遇到了这个问题,问题是由于$table->dropForeign([column_name]);
删除了索引而不是列本身。解决方案是在down
函数中将索引放在一个块中,然后将实际列放在一个单独的块中。由于无法在与删除列的位置相同的连接中删除密钥,因此必须将它们放入单独的块中。
所以down
函数应该是这样的:
public function down() {
// drop the keys
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign(['user_id']);
$table->dropForeign(['role_id']);
});
// drop the actual columns
Schema::table('role_user', function (Blueprint $table) {
$table->dropColumn('user_id');
$table->dropColumn('role_id');
});
}
Run Code Online (Sandbox Code Playgroud)
现在您可以运行php artisan migrate
以运行该up
函数并php artisan migrate:rollback
运行该down
命令并且该错误不再显示。
归档时间: |
|
查看次数: |
7706 次 |
最近记录: |