Laravel 8 调用Ad工厂时出现array_merge参数类型错误的排查
报错根本原因
该错误是Laravel 8 工厂 API 语法变更导致的参数类型不匹配。
你当前使用的Ad::factory()->create(10)是 Laravel 7 及更早版本的老式调用语法,在 Laravel 8.12 版本的内置工厂实现中,create()方法的第一个参数是需要和工厂默认定义合并的自定义属性数组,不再接收代表生成数量的整型参数。
框架在Factory.php:381位置执行array_merge()合并属性时,拿到你传入的整型值10,因无法将整数作为数组合并,直接抛出类型错误。因为错误发生在框架解析参数、准备调用工厂定义的前置流程中,栈轨迹不会指向你自定义的AdFactory实现文件。
修复方案
按照 Laravel 8 的工厂调用规范,生成指定数量测试数据时,需要将数量参数通过count()链式方法传递,再执行create():
// 错误写法(Laravel 7 及更早版本兼容) $ads = Ad::factory()->create(10); // 修正后的 Laravel 8 兼容写法 $ads = Ad::factory()->count(10)->create();
如果需要在生成时覆盖默认属性,才需要给create()方法传入数组参数,例如:
// 生成10条状态为下架的广告测试数据 $ads = Ad::factory()->count(10)->create([ 'status' => 'X' ]);
逻辑校验
可对照 Laravel 8 工厂的源码定义确认匹配关系:
count(int $count):专门用于设置要生成的模型实例数量,接收整型参数create(array $attributes = []):用于合并自定义属性,最终生成并持久化模型实例,接收数组参数
调整后参数类型完全匹配框架要求,可避免array_merge的类型报错。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

