Laravel中为子表递增字段day_of_week填充种子数据
实现每个店铺的day_of_week从0到6依次递增
场景说明
现有两张数据库表:
stores:包含字段id、namestore_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
相关产品推荐
相关产品推荐

