Laravel 播种产生的结果比预期多 3 倍
Laravel Seeding produces 3 times more results than expected
我正在开展一个 Laravel 项目,并尝试使用模型工厂为数据库播种。
我有一个横幅 table 和相关的 BannerTranslations 模型来保存翻译后的值。该项目将有 3 种语言。我正在尝试将 5 个虚拟值播种到与 BannerTranslations 相关的横幅 table 中。理论上,我希望为每个 Banner 行创建 3 个翻译行,这最终应该导致 BannerTranslations table 的 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();
});
}
BannerTranslationsFactory:
use App\BannerTranslation;
use Faker\Generator as Faker;
$factory->define(BannerTranslation::class, function (Faker $faker) {
return [
'banner_id' => function (array $banner) {
return App\Banner::find($banner['id'])->id;
},
'locale' => function (array $banner) {
return App\BannerTranslation::find($banner['banner_id'])->locale;
},
'title' => $faker->sentence(2),
'spot' => $faker->sentence(2),
'body' => $faker->realText(rand(80, 200)),
'alt' => null,
];
});
和 BannersTableSeeder:
$banners = factory(App\Banner::class, 5)->create()->each(function ($banner) {
$lang_count = count(config('laravellocalization.supportedLocales'));
foreach(LaravelLocalization::getSupportedLanguagesKeys() as $i => $key) {
factory(App\BannerTranslation::class, $lang_count)->create([
'banner_id' => $banner->id,
'locale' => $key,
]);
}
});
每次翻译产生 3 个相同的关键行('en'、'en'、'en'、'de'、'de'、'de'、 'fr'、'fr'、'fr') 而不是 ('en'、'de'、'fr')。因此,它 returns 一个独特的约束错误。
我不太熟悉使用工厂,但看着你正在检查 docs,你的问题是 factory(App\BannerTranslation::class, $lang_count)
中的第二个参数。您已经在循环 LaravelLocalization::getSupportedLanguagesKeys()
并为每个循环创建 3 条记录。
试一试:
$banners = factory(App\Banner::class, 5)->create()->each(function ($banner) {
foreach(LaravelLocalization::getSupportedLanguagesKeys() as $i => $key) {
factory(App\BannerTranslation::class)->create([
'banner_id' => $banner->id,
'locale' => $key,
]);
}
});
我正在开展一个 Laravel 项目,并尝试使用模型工厂为数据库播种。
我有一个横幅 table 和相关的 BannerTranslations 模型来保存翻译后的值。该项目将有 3 种语言。我正在尝试将 5 个虚拟值播种到与 BannerTranslations 相关的横幅 table 中。理论上,我希望为每个 Banner 行创建 3 个翻译行,这最终应该导致 BannerTranslations table 的 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();
});
}
BannerTranslationsFactory:
use App\BannerTranslation;
use Faker\Generator as Faker;
$factory->define(BannerTranslation::class, function (Faker $faker) {
return [
'banner_id' => function (array $banner) {
return App\Banner::find($banner['id'])->id;
},
'locale' => function (array $banner) {
return App\BannerTranslation::find($banner['banner_id'])->locale;
},
'title' => $faker->sentence(2),
'spot' => $faker->sentence(2),
'body' => $faker->realText(rand(80, 200)),
'alt' => null,
];
});
和 BannersTableSeeder:
$banners = factory(App\Banner::class, 5)->create()->each(function ($banner) {
$lang_count = count(config('laravellocalization.supportedLocales'));
foreach(LaravelLocalization::getSupportedLanguagesKeys() as $i => $key) {
factory(App\BannerTranslation::class, $lang_count)->create([
'banner_id' => $banner->id,
'locale' => $key,
]);
}
});
每次翻译产生 3 个相同的关键行('en'、'en'、'en'、'de'、'de'、'de'、 'fr'、'fr'、'fr') 而不是 ('en'、'de'、'fr')。因此,它 returns 一个独特的约束错误。
我不太熟悉使用工厂,但看着你正在检查 docs,你的问题是 factory(App\BannerTranslation::class, $lang_count)
中的第二个参数。您已经在循环 LaravelLocalization::getSupportedLanguagesKeys()
并为每个循环创建 3 条记录。
试一试:
$banners = factory(App\Banner::class, 5)->create()->each(function ($banner) {
foreach(LaravelLocalization::getSupportedLanguagesKeys() as $i => $key) {
factory(App\BannerTranslation::class)->create([
'banner_id' => $banner->id,
'locale' => $key,
]);
}
});