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
相关产品推荐
相关产品推荐

