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

Laravel工厂如何为Page模型动态生成随机同模型parent_id?

解决Laravel Page工厂批量创建时parent_id无法动态获取已生成页面ID的问题

你的问题出在工厂定义时,Page::all()->random()->id是一次性执行的——在你调用create()之前,这个查询就已经跑完了,所以所有新生成的页面都会复用同一个parent_id。要实现每次创建页面时都动态获取当前数据库中已存在的页面ID,只需要把parent_id的赋值逻辑改成闭包即可,闭包会在每个模型实例创建时单独执行。

修改后的工厂代码:

public function definition(): array
{
    return [
        'name'      => $this->faker->sentence(5),
        'url'       => $this->faker->url,
        'parent_id' => function () {
            // 每次创建时随机选取数据库中已存在的一个Page的ID
            return Page::inRandomOrder()->value('id');
        },
    ];
}

为什么这样有效?

  • 闭包会延迟执行内部的数据库查询,直到每个Page实例开始创建时才会运行
  • 每次执行查询时,数据库里已经包含了初始的默认页面,以及之前通过工厂刚创建的所有页面,完全符合你想要的递进式随机逻辑:
    • 第一个新页面创建时,只会选到默认页面的ID
    • 第二个新页面创建时,会从默认页面+第一个新页面中随机选
    • 后续页面以此类推

小优化

用inRandomOrder()->value('id')比all()->random()->id更高效,因为前者直接从数据库层面随机取ID,不需要把所有Page模型加载到内存中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:46:18