Laravel工厂生成关联数据时Sequence索引未重置问题
问题
我编写了如下Seeder函数,用Product工厂创建100个产品,每个产品关联生成5个Media数据。现在的问题是Media工厂里Sequence的$sequence->index不会在每个产品的5个媒体生成后重置为0,而是一直递增到499,我希望每个产品对应的媒体索引能循环为0、1、2、3、4。
代码示例:
Product::factory() ->count(100) ->state(new Sequence( fn($sequence) => ['age_group_marketplace_id' => $ageGroup->random()] )) ->has( Media::factory(5) ->state(new Sequence(...self::IMAGE_LIST)) ->state(new Sequence( fn ($sequence) => ['order_column' => $sequence->index] )) ) ->create();
解决方案
问题出在全局的Sequence实例会持续计数,不会为每个产品的Media关联重置。可以通过两种方式实现每个产品的Media索引从0到4循环:
方法一:利用关联计数生成索引
Product::factory() ->count(100) ->state(new Sequence( fn($sequence) => ['age_group_marketplace_id' => $ageGroup->random()] )) ->has( Media::factory(5) ->state(new Sequence(...self::IMAGE_LIST)) ->state(function (array $attributes, Media $media) { // 取当前产品下已关联的Media数量作为索引 return ['order_column' => $media->product->media()->count()]; }) ) ->create();
方法二:为每个产品创建独立的Sequence实例
Product::factory() ->count(100) ->state(new Sequence( fn($sequence) => ['age_group_marketplace_id' => $ageGroup->random()] )) ->has(function () { // 每个产品对应全新的Sequence,索引从0开始计数 return Media::factory(5) ->state(new Sequence(...self::IMAGE_LIST)) ->state(new Sequence( fn ($sequence) => ['order_column' => $sequence->index] )); }) ->create();
说明
- 方法一逻辑简单:每次创建Media时,直接读取当前产品已有的Media数量,自然形成0到4的递增索引。
- 方法二更贴合原代码逻辑:通过闭包让每个产品的Media生成逻辑独立初始化Sequence,避免全局索引累加。
内容的提问来源于stack exchange,提问作者Fendy Harianto
相关产品推荐
相关产品推荐

