Laravel中为Restaurant生成对应1-7天的OpeningHours工厂实现方案
解决Laravel中每个餐厅对应7条连续日期营业时间的问题
方案一:使用Factory的sequence方法(推荐)
直接在创建关联的has方法中,通过sequence为每条OpeningHours指定从1到7的day值,无需修改原有OpeningHoursFactory核心逻辑:
修改RestaurantSeeder代码:
<?php namespace Database\Seeders; use App\Models\OpeningHours; use App\Models\Restaurant; use Illuminate\Database\Seeder; class RestaurantSeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { Restaurant::factory() ->has( OpeningHours::factory() ->count(7) ->sequence(fn ($sequence) => ['day' => $sequence->index + 1]) ) ->count(10) ->create(); } }
$sequence->index从0开始,加1后即可得到1-7的连续日期值,完全匹配需求。
方案二:修改OpeningHoursFactory支持传入day参数
如果希望OpeningHoursFactory本身支持自定义day值,可调整工厂代码允许外部传入参数覆盖默认值:
修改OpeningHoursFactory:
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; /** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\OpeningHours> */ class OpeningHoursFactory extends Factory { /** * Define the model's default state. * * @return array<string, mixed> */ public function definition(): array { return [ "day" => $this->faker->numberBetween(1,7), "from_hour" => 0, "from_minute" => 0, "to_hour" => 23, "to_minute" => 59, ]; } // 添加方法设置day值 public function day(int $day): static { return $this->state(fn (array $attributes) => [ 'day' => $day, ]); } }
然后在RestaurantSeeder中循环创建7条记录,每条指定不同day:
<?php namespace Database\Seeders; use App\Models\OpeningHours; use App\Models\Restaurant; use Illuminate\Database\Seeder; class RestaurantSeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { Restaurant::factory()->count(10)->create()->each(function ($restaurant) { for ($day = 1; $day <= 7; $day++) { $restaurant->openingHours()->create( OpeningHours::factory()->day($day)->raw() ); } }); } }
必要前置检查
确保Restaurant与OpeningHours模型已正确建立一对多关联:
- 在
Restaurant模型中添加:public function openingHours() { return $this->hasMany(OpeningHours::class); } - 在
OpeningHours模型中添加:public function restaurant() { return $this->belongsTo(Restaurant::class); }
若数据库day字段设置了「餐厅内唯一」约束,上述方案均能保证数据不违反该规则。
内容的提问来源于stack exchange,提问作者Mathieu Monfort
相关产品推荐
相关产品推荐

