我正在研究的项目使用mysql db进行测试和开发(不同的db)。运行php artisan migrate:refresh
时,一切正常。
但是,在运行测试时,它无法运行所有迁移,并出现以下错误:
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1005 Can't create table `cmstatic_test`.`#sql-5008_121` (errno: 121 "Duplicate key on write or update") (SQL: alter table `project_user` add constraint `project_user_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)
这是我的迁移方法
public function up()
{
Schema::create('project_user', function (Blueprint $table) {
$table->unsignedBigInteger('project_id');
$table->foreign('project_id')
->references('id')->on('projects')
->onDelete('cascade');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
$table->unsignedBigInteger('role_id');
$table->foreign('role_id')
->references('id')->on('roles');
$table->timestamps();
});
}
我不知道如何为该表设置重复的键。
我的测试看起来像
use Illuminate\Foundation\Testing\RefreshDatabase;
class AuthTest extends TestCase
{
use RefreshDatabase;
...
如果我删除
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
可以再次运行测试。但是,我想要那个外键关系-.-
我在删除添加外键的行后检查了表结构,显然未设置外键。因此,没有其他迁移可以做到这一点。
答案 0 :(得分:0)
尝试一下:
public function up()
{
if (!Schema::hasTable('project_user')) {
Schema::create('project_user', function (Blueprint $table) {
$table->unsignedBigInteger('project_id');
$table->foreign('project_id')
->references('id')->on('projects')
->onDelete('cascade');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
$table->unsignedBigInteger('role_id');
$table->foreign('role_id')
->references('id')->on('roles');
$table->timestamps();
});
}
}
答案 1 :(得分:0)
我的数据库本身似乎有错误。我已多次删除表并再次尝试,但错误仍然存在。
但是,删除整个数据库并重新创建它可以解决 问题。
这对于面临此问题的任何人也可能很有趣。