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

Laravel中为子表递增字段day_of_week填充种子数据

实现每个店铺的day_of_week从0到6依次递增

场景说明

现有两张数据库表:

  • stores:包含字段id、name
  • store_opening_hours:包含字段id、store_id、day_of_week、opens_at、closes_at

已提供Laravel工厂和播种文件,要求每个店铺对应的营业时间记录中,day_of_week字段从0到6依次递增,需在StoreOpeningHourFactory.php中实现该逻辑。

解决方案

1. 修改StoreOpeningHourFactory.php

添加静态计数器跟踪当前生成的星期数,在定义方法中使用该计数器并自动递增,同时提供重置计数器的方法:

class StoreOpeningHourFactory extends Factory
{
    // 静态变量追踪当前店铺的星期数
    protected static int $dayCounter = 0;

    public function definition(): array
    {
        // 获取当前计数器值,递增后超过6则重置为0
        $day = static::$dayCounter;
        static::$dayCounter = (static::$dayCounter + 1) % 7;

        return [
            'store_id' => Store::factory(),
            'day_of_week' => $day,
            'opens_at' => fake()->time('H:i'),
            'closes_at' => fake()->time('H:i'),
        ];
    }

    // 重置星期计数器的方法
    public static function resetDayCounter(): void
    {
        static::$dayCounter = 0;
    }
}

2. 修改StoreFactory.php

添加configure方法,利用afterCreating钩子,在每个店铺创建完成后重置营业时间的星期计数器,确保下一个店铺的营业时间从0开始:

class StoreFactory extends Factory
{
    public function configure()
    {
        return $this->afterCreating(function () {
            // 每个店铺创建完成后重置计数器
            StoreOpeningHourFactory::resetDayCounter();
        });
    }

    public function definition(): array
    {
        return [
            'name' => fake()->company()
        ];
    }
}

原理说明

  • 静态变量$dayCounter会在每次生成营业时间记录时自动递增,当数值达到6后,通过取模运算重置为0,保证生成0-6的循环序列。
  • StoreFactory的afterCreating钩子会在每个店铺及其关联的7条营业时间记录生成完成后,重置计数器,确保每个店铺的营业时间都是从0到6依次排列。

内容的提问来源于stack exchange,提问作者Sourav Malo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:21:34