У меня есть таблица Users, которая действует как абстрактная таблица для таблиц Engineers и Architects.
Users [id (PK), first_name, last_name, role]
где «роль» — это либо «Инженер», либо «Архитектор» Engineers [id (PK/FK), experience, skill_set]
где иностранный «id» ссылается на «id» на «Пользователи»Architects [id (PK/FK), certification, level]
где сторонний «id» ссылается на «id» на «Пользователи»
(Атрибуты таблицы произвольны. Я просто хотел донести идею. По сути, есть две таблицы с общими атрибутами. Общие атрибуты перемещены в отдельную таблицу).
После заполнения таблицы Users мне нужно заполнить таблицу Engineers уникальным идентификатором, соответствующим таблице Users (поскольку это PK и FK), где Users.role == 'Engineer'.
То же самое нужно сделать для Architects.
Мое текущее решение состоит в том, чтобы создать пользователей, выполнить запрос, чтобы получить всех пользователей, где «роль» — «инженер», и в операторе foreach
создать инженеров для каждого пользователя.
class DatabaseSeeder extends Seeder
{
public function run()
{
$faker = Faker\Factory::create();
$users = factory(App\User::class, 10)->create(); // Create Users
$engineers = App\User::all()->where('role', 'engineer');
foreach($engineers as $engineer){
App\Engineer::create([
'id' => $engineer->id,
...
]);
}
}
}
Как переместить App\Engineer в собственный сеялку?
Мой мыслительный процесс состоял в том, чтобы создать массив пользователей, где «роль» == «инженер». Затем вытащите пользователя и используйте User->id этого пользователя при создании инженера.
class EngineersTableSeederextends Seeder
{
public function run()
{
$engineers = App\User::all()->where('role', 'engineer');
$engineer = array_pop( $engineers );
factory(App\Engineer::class, 10)->create()->each(function($e) {
//$p-> ; ???
});
}
}
Я также пробовал это внутри EngineerFactory;
use Faker\Generator as Faker;
$factory->define(App\Engineer::class, function (Faker $faker) {
return [
'id' => $faker->unique()->randomElement(App\User::all()->where('roles', 'engineer')->pluck('id')->toArray()),
...
];
});
Однако из-за модификатора unique()
я получаю ошибку Maximum retries of 10000 reached without finding a unique value
. Это работает, если у меня около 100 пользователей, но я создаю только 10 инженеров.
Я не уверен, что это правильный подход.