0

我正在开发一个 Laravel 项目,并尝试使用模型工厂为数据库播种。

我有一个横幅表和相关的 BannerTranslations 模型来保存翻译值。该项目将有 3 种语言。我正在尝试将 5 个虚拟值播种到与 BannerTranslations 相关的横幅表中。理论上,我希望为每个 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();
    });
}

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')。正因为如此,它返回一个唯一的约束错误。

4

1 回答 1

2

我不太熟悉使用工厂,但看着你并检查文档,你的问题在于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,
        ]);
    }
});
于 2020-04-13T14:36:06.083 回答