我一直在努力解决这个问题已经有一段时间了,而且我对解决方案感到有点迫切,因为我在解决问题方面并不是那么出色。无论如何,我正试图为我的数据库播种,我在他的论坛系列中跟随了来自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
答案 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条记录,如果它们需要是唯一的,那么它们当然会失败。将title
和slug
创建转换为循环,以确保每次迭代都是新的且唯一的:
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()来获得软删除的行。