Фабрика модельных отношений в Ларавеле
У меня есть 2 таблицы с именами Users и Users_meta. Оба разделяют отношения один-к-одному. Я хотел бы вставить фиктивные данные с помощью посева. Я могу это сделать, единственное, что сводит меня с ума, это то, что я не могу установить отношения между пользователями и таблицей users_meta с user_id в качестве внешнего ключа. Я пробовал несколько способов, но это либо создает дубликаты записей с тем же user_id или продолжает повторять тот же user_id.
Что именно я хотел бы это; например, при создании 100 записей, после первой вставки записи пользователя, он должен взять тот же user_ID пользователя, добавить его в поле user_id таблицы users_meta и повторить вставку до 100 поддельных записей.
Любая помощь по этому вопросу будет принята с благодарностью
Код в: UserFactory.php
$factory->define(App\User::class, function (Faker $faker) {
static $password;
return [
'username' => $faker->userName,
'email' => $faker->unique()->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'referral_code' => str_random(10),
'referred_by_code' => str_random(10),
'role' => $faker->randomElement(['administrator', 'user', 'volunteer']),
'remember_token' => str_random(10),
]; });
Код в: UsersMetaFactory.php
$factory->define(App\Usersmeta::class, function (Faker $faker) {
return [
'user_id' => $faker->randomElement(\App\User::pluck('id')->toArray()),
'first_name' => $faker->firstname,
'last_name' => $faker->lastname,
'gender' => $faker->randomElement(['male', 'female']),
'date_of_birth' => $faker->dateTimeThisCentury->format('Y-m-d'),
'address' => $faker->address,
'city' => $faker->city,
'state' => $faker->state,
'zip_code' => $faker->postcode,
'country' => $faker->country,
'cell_phone' => $faker->e164PhoneNumber,
'bitcoin_address' => str_random(16),
'monero_address' => str_random(16),
'security_question' => $faker->realText($maxNbChars = 20, $indexSize = 2),
'security_answer' => $faker->realText($maxNbChars = 40, $indexSize = 2),
'is_founder' => $faker->boolean($chanceOfGettingTrue = 50),
'status' => $faker->randomElement(['active', 'inactive']),
'terms' => $faker->boolean
]; });
Метод randomElement() дает мне случайный идентификатор, который нарушает принцип отношения один-к-одному, и мое приложение выходит из строя. Я хотел бы получить идентификатор из таблицы пользователей и передать тот же идентификатор, что и user_id в таблицу users_meta и продолжить генерировать поддельные записи.
Класс миграции CreateUsersTable
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username')->unique();
$table->string('email')->unique();
$table->string('password');
$table->string('referral_code')->unique();
$table->string('referred_by_code');
$table->enum('role', ['administrator', 'user', 'volunteer'])->nullable();
$table->rememberToken();
$table->timestamps();
});
}
Класс миграции CreateUsersMetaTable
public function up()
{
Schema::create('users_meta', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->string('first_name');
$table->string('last_name');
$table->enum('gender', ['male', 'female'])->nullable();
$table->string('date_of_birth')->nullable();
$table->string('address')->nullable();
$table->string('city')->nullable();
$table->string('state')->nullable();
$table->string('zip_code')->nullable();
$table->string('country');
$table->string('cell_phone');
$table->string('bitcoin_address')->nullable();
$table->string('monero_address')->nullable();
$table->string('security_question');
$table->string('security_answer');
$table->string('is_founder')->nullable();
$table->enum('status', ['active', 'inactive'])->nullable();
$table->string('terms');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users_meta');
Schema::enableForeignKeyConstraints();
}
1 ответ
Вы должны удалить эту строку:
'user_id' => $faker->randomElement(\App\User::pluck('id')->toArray()),
И использовать отношения при создании новой модели. Вот модифицированный пример из документов:
factory(App\User::class, 50)->create()->each(function ($u) {
$u->usersmeta()->save(factory(App\Usersmeta::class)->make());
});