You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

说明

  1. 方法一逻辑简单:每次创建Media时,直接读取当前产品已有的Media数量,自然形成0到4的递增索引。
  2. 方法二更贴合原代码逻辑:通过闭包让每个产品的Media生成逻辑独立初始化Sequence,避免全局索引累加。

内容的提问来源于stack exchange,提问作者Fendy Harianto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:36