【发布时间】:2016-01-30 06:55:26
【问题描述】:
我在 Laravel 5.1 中使用数据库迁移和播种。
迁移
public function up()
{
Schema::create('teachers', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('teacher_id')->unsigned();
$table->boolean('disable')->default(0);
$table->timestamps();
$table->unique(['user_id', 'teacher_id']);
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('teacher_id')->references('id')->on('users')->onDelete('cascade');
});
}
*** user_id 和teacher_id 必须是唯一的。
模型工厂
$factory->define(App\Teacher::class, function ($faker) {
return [
'user_id' => $faker->numberBetween(1, 59),
'teacher_id' => $faker->numberBetween(1, 59),
];
});
我在DatabaseSeeder.php 中设置了生产500 名教师关系的播种机:
factory(App\Teacher::class, 500)->create();
但我收到了这个错误:
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10-11' for key 'teachers_user_id_teacher_id_
unique'
如您所见,***(唯一属性)导致了错误。 有什么办法可以解决吗?你的想法是什么?
【问题讨论】:
-
尝试生成
500唯一的用户和教师 ID 对,同时允许每个用户和教师 ID 之间有一个介于1和59之间的数字,由于范围小,无疑会导致重复。C(59,2)给出了1711可能的组合,对于您要生成的500项目将有很高的重复对的机会,从而引发 "Duplicate entry" 错误。因此,最好的办法是将numberBetween的上限增加到明显高于59的值,或者在尝试存储新的配对之前缓存并检查以前生成的配对,以确保没有重复。 -
@Bogdan 有没有办法自定义工厂功能以防止重复?增加上限并不能解决问题。
-
尝试将每个生成的对缓存在一个数组中,例如命名为
$savedPairs,并且当每个新的$pair生成时,使用array_search($pair, $savedPairs)搜索该数组,并且只保存新的数据库条目,如果搜索结果为false。
标签: php laravel laravel-5.1 laravel-migrations laravel-seeding