Laravel 9:如何从Seeder向Factory传递数组参数并解决报错
解决方案
方法一:Seeder循环批量生成(最直接)
直接在Seeder中遍历你的$refUrls数组,为每个URL生成指定数量的关联记录,无需修改Factory的定义:
// Database/Seeders/BannerClickedCountSeeder.php public function run() { // 定义需要重复分组的URL数组 $refUrls = [ 'https://example.com/banner-001', 'https://example.com/banner-002', 'https://example.com/banner-003', ]; // 遍历每个URL,生成5条关联该URL的记录(数量可自定义) foreach ($refUrls as $url) { BannerClickedCount::factory() ->count(5) ->create(['ref_url' => $url]); // 直接给模型的ref_url字段赋值 } }
对应的Factory保持基础定义即可,只需要处理其他默认字段:
// Database/Factories/BannerClickedCountFactory.php public function definition() { return [ 'clicks' => rand(1, 100), 'created_at' => now()->subDays(rand(0, 30)), // 其他字段... ]; }
方法二:结合Sequence实现批量分组生成
如果想用Sequence实现,需要确保传给Sequence的每个元素是关联数组(对应字段赋值),而不是纯字符串。之前的报错就是因为直接传了字符串,导致Factory无法合并数据。
// Database/Seeders/BannerClickedCountSeeder.php public function run() { $refUrls = [ 'https://example.com/banner-001', 'https://example.com/banner-002', 'https://example.com/banner-003', ]; // 构造Sequence需要的数组:每个URL重复5次,包装为字段赋值数组 $sequenceItems = collect($refUrls)->flatMap(function ($url) { return array_fill(0, 5, ['ref_url' => $url]); }); // 生成总记录数(3个URL×5条=15条) BannerClickedCount::factory() ->count($sequenceItems->count()) ->state(new Sequence(...$sequenceItems)) ->create(); }
错误原因说明
你之前遇到的两类报错,本质是Sequence的用法错误:
current(): Argument #1 ($array) must be of type array, string given:直接将URL字符串传入Sequence,而Sequence期望每个元素是数组(用于和Factory的definition合并)array_merge(): Argument #2 must be of type array, string given:Factory尝试将Sequence的字符串元素和definition数组合并,类型不匹配导致报错
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

