1

ピボット テーブル用の soem シーダー データを作成しようとしています。以下のコードは、重複エラーが発生する 1 点まで機能します。

これをより適切に行う方法や、重複を起こさないようにこのコードを改善する方法はありますか?

 $factory->define(Namespacehere\PostTag::class, function ($faker){

    $postsId =  $faker->randomElement(Namespacehere\Post::lists('id')->toArray());
    $tagsId =  $faker->randomElement(Namespacehere\Tag::lists('id')->toArray());

      return [
         'post_id' => $postsId,
         'tag_id' => $tagsId
      ];
 });

エラーあり Integrity constraint violation: 1062 Duplicate entry

しかし、まれに合格することもありますが、常に合格するようにしたいと考えています。

これは私のシーダークラスで実行されます

  public function run()
      {
          Namespacehere\PostTag::truncate();
          factory(Namespacehere\PostTag::class, 30)->create();
      }

ありがとう

4

1 に答える 1

0

ランダムに作成されたIDをチェックするための再帰的な方法を作成しようとしました。それは私の仕事です。

$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->sentence(mt_rand(3, 10)),
        'content' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))),
        'published_at' => $faker->dateTimeBetween('-1 month', '+3 days'),
    ];
});

$factory->define(App\Tags::class, function ($faker) {
    return [
        'title' => $faker->sentence(mt_rand(1, 3)),
    ];
});


$PostTagFactory = function ($faker) use (&$PostTagFactory) {

    $ids = [
        'post_id' => $faker->randomElement(App\Post::lists('id')->toArray()),
        'tag_id' => $faker->randomElement(App\Tags::lists('id')->toArray())
    ];

    if (App\PostTag::where('post_id', $ids['post_id'])->where('tag_id', $ids['tag_id'])->first() == null) {
        return $ids;
    } else {
        return $PostTagFactory();
    }

};

$factory->define(App\PostTag::class, $PostTagFactory);
于 2015-12-15T22:13:07.420 に答える