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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:57:17