Laravel Seeding产生的结果是预期的3倍



我正在进行一个Laravel项目,并试图使用模型工厂为数据库种子。

我有一个Banners表和相关的BannerTranslations模型来保存翻译后的值。该项目将有3种语言。我正在尝试将5个伪值播种到BannerTranslations相关的Banners表中。理论上,我预计每个Banner行都会创建3个翻译行,这最终会导致BannerTranslations表中有15个条目(3x5(。但我收到了45个参赛作品。每个平移行被播种3次而不是1次。我确信我错过了一些显而易见的东西,但我不知道是什么。

翻译迁移:

public function up()
{
Schema::create('banner_translations', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedInteger('banner_id');
$table->string('locale')->index();
$table->string('title');
$table->string('spot')->nullable();
$table->text('body')->nullable();
$table->string('alt')->nullable();
//$table->unique(['banner_id', 'locale']);
$table->foreign('banner_id')->references('id')->on('banners')->onDelete('cascade');
$table->timestamps();
});
}

横幅翻译工厂:

use AppBannerTranslation;
use FakerGenerator as Faker;
$factory->define(BannerTranslation::class, function (Faker $faker) {
return [
'banner_id' => function (array $banner) {
return AppBanner::find($banner['id'])->id;
},
'locale' => function (array $banner) {
return AppBannerTranslation::find($banner['banner_id'])->locale;
},
'title' => $faker->sentence(2),
'spot' => $faker->sentence(2),
'body' => $faker->realText(rand(80, 200)),
'alt' => null,
];
});

和BannersTableSeeder:

$banners = factory(AppBanner::class, 5)->create()->each(function ($banner) {
$lang_count = count(config('laravellocalization.supportedLocales'));
foreach(LaravelLocalization::getSupportedLanguagesKeys() as $i => $key) {
factory(AppBannerTranslation::class, $lang_count)->create([
'banner_id' => $banner->id,
'locale' => $key,
]);
}
});

这导致每次翻译有3个相同的键行('en','en'、'en'和'de','de'、'fr'、'r'(,而不是('en]、'de'和'fr'(。正因为如此,它返回了一个唯一的contconstraint错误。

我不太熟悉使用工厂,但看看你的并检查文档,你的问题是factory(AppBannerTranslation::class, $lang_count)中的第二个参数。您已经在循环使用LaravelLocalization::getSupportedLanguagesKeys(),并且在中为每一个创建3条记录。

试试看:

$banners = factory(AppBanner::class, 5)->create()->each(function ($banner) {
foreach(LaravelLocalization::getSupportedLanguagesKeys() as $i => $key) {
factory(AppBannerTranslation::class)->create([
'banner_id' => $banner->id,
'locale' => $key,
]);
}
});

我使用了这个方法。它也可以帮助你。

Download::factory(26)
->create()
->each( function($download) {
foreach(Language::where(['status' => 1])->get() as $language){
DownloadTranslation::factory(1)->state(['language_code' => $language['code']])
->create()
->each(function($download_translation) use (&$download) {
$download->translations()->save($download_translation)->make();
});
}
});

最新更新