Laravel执行DatabaseSeeder报Too few arguments错误求代码排查
问题排查与修复方案
错误根源
- Post工厂state回调参数不匹配:你在Post的state闭包里声明了
function (array $attributes, User $user, Category $category)三个入参,但Laravel调用关联子工厂的state时,只会传入两个参数:当前子工厂的属性数组、父级模型(这里Post的父级是User,所以只会传前两个参数),没有自动注入Category的逻辑,因此触发参数数量不足的报错。 - Comment工厂state回调参数与字段逻辑错误:Comment作为Post的关联子模型,state回调只会传入
$attributes和$post两个参数,你多声明了User入参,同时错误将category_id赋值为Post的id,不符合业务关联逻辑。 - 冗余逻辑:
has方法会自动填充关联父级的外键,不需要手动在state里赋值user_id这类关联字段,属于多余代码。
修复方案
按照你要生成若干分类、1个及以上用户,并关联生成对应Profile、Post、Comment的需求,修复后代码如下:
public function run() { // 先生成10个分类 Category::factory()->count(10)->create(); User::factory() // has方法自动给Profile填充user_id,无需手动写state ->has(Profile::factory()) ->has(Post::factory()->count(50) // 给Post随机绑定已生成的分类 ->state(function (array $attributes) { return [ 'category_id' => Category::inRandomOrder()->value('id') ]; }) // 每条Post关联3条Comment,has方法自动填充post_id ->has(Comment::factory()->count(3) // 若需要Comment的user_id和所属Post的user_id保持一致,可按此逻辑赋值 ->state(function (array $attributes, Post $post) { return [ 'user_id' => $post->user_id ]; }) ) ) // 需要生成多个用户时添加->count(N)即可,默认生成1个用户 ->create(); }
内容的提问来源于stack exchange,提问作者Bilal Yousaf
相关产品推荐
相关产品推荐

