我尝试播种种子文件,但出现此错误

时间:2019-04-23 11:51:21

标签: php mysql laravel

我试图发出

$  php artisan db:seed
  

种子:RoleSeeder

     

在Connection.php第664行中:

     

SQLSTATE [42000]:语法错误或访问冲突:1701无法   截断外键约束中引用的表   (newsusers,CONST RAINT users_role_id_foreign外键   (role_id参考newsrolesid))(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');
});

1 个答案:

答案 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表中的从属值。