Laravel Seeding产生的结果比预期多3倍

bq8i3lrv  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(147)

我正在从事一个Laravel项目,并试图通过使用模型工厂来为数据库播种。
我有一个横幅表和相关的BannerTranslations模型来保存翻译值。该项目将有3种语言。我试图种子5虚拟值到横幅表有关的BannerTranslations。理论上,我希望为每个横幅行创建3翻译行,这将产生15个条目(3x5)到BannerTranslations表。但是我得到了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 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,
    ];
});

和横幅表格种子:

$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')而不是('en ','de','fr ')。因此,它返回一个唯一的约束错误。

6uxekuva

6uxekuva1#

我不太熟悉使用工厂,但是看看你的文档,你的问题是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,
        ]);
    }
});
9rnv2umw

9rnv2umw2#

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

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();
                    });
                }
            });

相关问题