我试图发出
$ php artisan db:seed
种子:RoleSeeder
在Connection.php第664行中:
SQLSTATE [42000]:语法错误或访问冲突:1701无法 截断外键约束中引用的表 (
news
。users
,CONST RAINTusers_role_id_foreign
外键 (role_id
参考news
。roles
(id
))(SQL:截断roles
)
这是我的Roleseeder.php文件
<?php
use Illuminate\Database\Seeder;
use App\Role ;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Role::truncate();
Role::create([
'title' => 'Students',
'description' => 'Lorem ipsum dolor.'
]);
// ....
我不明白为什么会收到这个错误。
我有此迁移文件
Schema::table('users', function (Blueprint $table) {
$table->integer('role_id')->unsigned()->after("id")->nullable();
$table->foreign('role_id')
->references('id')->on('roles')
->onDelete('restrict');
});
答案 0 :(得分:1)
您的播种失败,因为您试图截断某个表,在该表中存在其他表通过外键关系依赖的值。您的用户具有角色,该角色限制您截断角色表。
相反,您可以使用firstOrCreate()
方法,该方法仅在不存在该值时才创建它。
public function run()
{
Role::firstOrCreate([
'title' => 'Students',
'description' => 'Lorem ipsum dolor.'
]);
}
或者,如果您出于某种原因希望能够在每次播种之间更改描述,则可以使用firstOrNew()
。
public function run()
{
$role = Role::firstOrNew([
'title' => 'Students'
]);
$role->description = 'Lorem ipsum dolor.';
$role->save();
}
或者,您可以更改外键关系以将其值(如果该值被删除)设置为null(请注意,当您随后截断Roles
时,所有用户的角色都将设置为NULL
)。
->onDelete('set null');
如果实际上需要截断该表,则首先需要清除roles
表中的从属值。