Laravel播种产生的结果是预期结果的3倍

Laravel播种产生的结果是预期结果的3倍,laravel,eloquent,laravel-seeding,factories,Laravel,Eloquent,Laravel Seeding,Factories,我正在从事一个Laravel项目,并试图通过使用模型工厂为数据库播种 我有一个横幅表和相关的横幅翻译模型来保存翻译后的值。该项目将有3种语言。我试图在Banners表中植入5个与BannerTranslations相关的虚拟值。理论上,我希望为每个横幅行创建3个翻译行,这将导致横幅翻译表最终有15个条目(3x5)。但是我得到了45个条目。每个翻译行的种子设定为3次,而不是1次。 我肯定我错过了一些非常明显的东西,但我不知道是什么 翻译迁移: public function up() {

我正在从事一个Laravel项目,并试图通过使用模型工厂为数据库播种

我有一个横幅表和相关的横幅翻译模型来保存翻译后的值。该项目将有3种语言。我试图在Banners表中植入5个与BannerTranslations相关的虚拟值。理论上,我希望为每个横幅行创建3个翻译行,这将导致横幅翻译表最终有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 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'、'fr'、'fr'),而不是('en'、'de'、'fr')。正因为如此,它返回一个唯一的contstraint错误。

我不太熟悉工厂的使用,但看看您正在检查的,您的问题是工厂中的第二个参数(App\bannertransation::class,$lang\u count)。您已经在
LaravelLocalization::getSupportedLanguagesKeys()
中循环,并为每个记录创建了3条记录

尝试一下:

$Banner=factory(App\Banner::class,5)->create()->每个函数($Banner){
foreach(LaravelLocalization::getSupportedLanguagesKeys()作为$i=>$key){
工厂(应用程序\BannerTranslation::类)->创建([
'banner_id'=>$banner->id,
'locale'=>$key,
]);
}
});

我不太熟悉工厂的使用,但看看您正在检查的,您的问题在于
工厂中的第二个参数(App\bannertransation::class,$lang\u count)
。您已经在
LaravelLocalization::getSupportedLanguagesKeys()
中循环,并为每个记录创建了3条记录

尝试一下:

$Banner=factory(App\Banner::class,5)->create()->每个函数($Banner){
foreach(LaravelLocalization::getSupportedLanguagesKeys()作为$i=>$key){
工厂(应用程序\BannerTranslation::类)->创建([
'banner_id'=>$banner->id,
'locale'=>$key,
]);
}
});

你说得对。我完全错过了试图过度思考一切的机会。谢谢,你说得对。我完全错过了试图过度思考一切的机会。非常感谢。