В Laravel, посев базы данных обычно осуществляется через фабрики моделей. Таким образом, вы определите план для вашей модели с использованием данных обманщика, и сказать, сколько экземпляров вам нужно:Laravel - Взаимоотношения с посевом
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
$user = factory(App\User::class, 50)->create();
Однако, позволяет сказать, что ваша модель пользователя имеет hasMany
отношения со многими другими моделями, как в Post
модель, например:
Post:
id
name
body
user_id
Таким образом, в этой ситуации, вы хотите, чтобы семя таблицы сообщений с фактических пользователей, которые были посеяны в таблице пользователей. Это, кажется, не быть явно обсуждали, но я нашел следующее в документации Laravel:
$users = factory(App\User::class, 3)
->create()
->each(function($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
Так что в вашем User заводе, вы создаете X число сообщений для каждого пользователя вы создаете. Однако в большом приложении, где, возможно, 50 - 75 моделей разделяют отношения с пользовательской моделью, ваш пользовательский сеятель, по сути, в конечном итоге высевает всю базу данных со всеми ее отношениями.
Мой вопрос: это лучший способ справиться с этим? Единственное, что я могу придумать, это сначала Seed the Users (без посева каких-либо отношений), а затем вытащить случайных пользователей из БД по мере необходимости, пока вы высеиваете другие Модели. Однако в тех случаях, когда они должны быть уникальными, вам нужно будет отслеживать, какие пользователи были использованы. Кроме того, похоже, это добавит много дополнительных запросов к процессу посева.
Спасибо за ответ. Я пробовал такие вещи. Однако, если я хочу использовать тот же набор пользователей, например, 20 других моделей, я чувствую, что мои сеялки довольно запутались. По сути, вся моя логика посева заканчивается в одном файле, потому что «Пользователь» связан с множеством других моделей. Но, возможно, нет лучшего способа. – djt