Laravel seeding — уникальные пары идентификаторов пользователя и учителя

Я использую миграцию базы данных и заполнение в 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),
];
});

Я настроил сеялку для производства 500 учителей реляционных в DatabaseSeeder.php:
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'

Как видите, ошибка *** (уникальное свойство) вызвала ошибку.
есть ли способ это исправить? Какая у тебя идея?

1

Решение

Вы можете получить коллекцию User модели, а затем в while Цикл присваивает пары из случайных идентификаторов в этой коллекции:

$users = User::all(['id']);

while ($users->count() > 1) {
// Get random user for a teacher, and remove from collection
$teacher = $users->random();
$users->pull($teacher->getKey());

// Get random user and remove from collection
$user = $users->random();
$users->pull($user->getKey());

Teacher::create([
'user_id' => $user->getKey(),
'teacher_id' => $teacher->getKey(),
]);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]