Laravel执行php artisan db:seed出现count()参数类型错误如何解决
错误原因排查
首先可以明确:你猜测的「未给deleted_at字段赋值导致报错」不成立。deleted_at是软删除字段,默认允许为NULL,不赋值不会触发count()相关的参数错误。
这个报错本质是PHP 7.2+版本对count()函数的参数校验更严格,当代码尝试给count()传入不可数的非数组/非实现Countable接口的对象时就会抛出,Laravel版本过低和PHP版本不兼容是最常见的诱因。
解决方案
按优先级逐一排查:
1. 匹配Laravel和PHP版本
如果你的Laravel版本 <= 5.4,同时PHP版本 >=7.2,直接触发该兼容问题。可选两种修复方案:
- 将PHP版本降级到7.1.x
- 将Laravel升级到5.5及以上的LTS版本
2. 修正Area模型的软删除配置
你的area表包含deleted_at字段,说明启用了软删除,必须在模型中引入对应Trait,否则会出现底层逻辑异常:
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Area extends Model { use SoftDeletes; // 必须添加该行开启软删除 protected $fillable = ['name']; // 允许name字段批量赋值 protected $dates = ['deleted_at']; }
3. 调整填充类代码写法
优先使用Eloquent的create()方法代替查询构造器的insert(),会自动处理created_at、updated_at字段,代码更简洁:
<?php use Illuminate\Database\Seeder; use App\Area; class AreaTableSeeder extends Seeder { public function run() { Area::create([ 'name' => 'Dhanmondi' ]); } }
4. 确认填充类调用配置
检查database/seeds/DatabaseSeeder.php的run方法中,已经正确注册了该填充类:
public function run() { $this->call(AreaTableSeeder::class); }
5. 清理缓存后重新执行
先执行以下命令清理项目缓存:
php artisan cache:clear php artisan config:clear
再重新执行填充命令:
php artisan db:seed
内容的提问来源于stack exchange,提问作者Osik Newton
相关产品推荐
相关产品推荐

