Laravel - 完整性约束违规:1062重复输入

时间:2017-11-11 10:24:39

标签: php laravel laravel-5

我一直在努力解决这个问题已经有一段时间了,而且我对解决方案感到有点迫切,因为我在解决问题方面并不是那么出色。无论如何,我正试图为我的数据库播种,我在他的论坛系列中跟随了来自Laracasts的Jeffrey教程,在那里他给一个帖子添加了一个slug。好吧,我正在尝试对我的帖子做同样的事情但是当我播种我的数据库时,我得到了标题中说明的错误,是什么导致了这个?

我在这里进行了迁移:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->Unsignedinteger('user_id');
        $table->Unsignedinteger('channel_id');
        $table->string('title');
        $table->longText('text');
        $table->string('slug')->unique();
        $table->timestamps();
    });
}

这就是我正在尝试用播种机做的事情:

public function run()
{
    $faker = Faker\Factory::create();
    $title = $faker->sentence;

    foreach(range(1, 30) as $index) {
        DB::table('posts')->insert([
            'user_id' => rand(1, 50),
            'channel_id' => rand(1,14),
            'title' => $faker->sentence,
            'slug' => str_slug($title),
            'text' => $faker->paragraph,
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),
        ]);

    }
}

为了保持这个问题的简短,我将在图片中显示完整的错误代码:https://imgur.com/a/ntQMX

但问题是,在我的迁移中,我将slug设置为唯一的。在我的种子中,我将标题指定为slug,并且由于slug是唯一的,因此无法完成,但是在教程中,他做了同样的事情,我该如何解决这个问题?

提前致谢!

指向教程的链接:https://laracasts.com/series/lets-build-a-forum-with-laravel/episodes/75

4 个答案:

答案 0 :(得分:1)

你应该试试这个:

public function run()
{
    $faker = Faker\Factory::create();

    foreach(range(1, 30) as $index) {

      $title = $faker->sentence;

      DB::table('posts')->insert([
          'user_id' => rand(1, 50),
          'channel_id' => rand(1,14),
          'title' => $faker->sentence,
          'slug' => str_slug($title),
          'text' => $faker->paragraph,
          'created_at' => Carbon::now(),
          'updated_at' => Carbon::now(),
      ]);

    }

}

答案 1 :(得分:0)

您的$title仅在您的循环外设置1x。因此,您尝试使用相同的slug创建30条记录,如果它们需要是唯一的,那么它们当然会失败。将titleslug创建转换为循环,以确保每次迭代都是新的且唯一的:

public function run()
{
    $faker = Faker\Factory::create();

    foreach(range(1, 30) as $index) {

        $title = $faker->sentence;
        $slug = str_slug($title);

        DB::table('posts')->insert([
            'user_id' => rand(1, 50),
            'channel_id' => rand(1,14),
            'title' => $title,
            'slug' => $slug,
            'text' => $faker->paragraph,
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),
        ]);

    }
}

答案 2 :(得分:0)

迁移中有两个拼写错误:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('user_id'); // here
        $table->unsignedInteger('channel_id'); // and here
        $table->string('title');
        $table->longText('text');
        $table->string('slug')->unique();
        $table->timestamps();
    });
}

然后我建议您根据自己的需要使用Model Factories

答案 3 :(得分:0)

在我的情况下,我在test -database中有具有重复ID的行,其中softDelete处于打开状态(即delete_at设置),这导致了此错误。就我而言,我添加了Model :: withTrashed()-> where()来获得软删除的行。