Laravel 5.4执行php artisan db:seed时触发Array To String Conversion异常
解决Laravel db:seed时的Array to string conversion异常
这个错误很常见,核心原因是你试图把一个数组类型的值插入到数据库的字符串类型字段中。从你给出的SQL语句来看,最可能出问题的是verification_token字段(SQL里它的值为空,但大概率你的Factory里生成这个字段时返回了数组,而非字符串)。我来一步步帮你排查修复:
1. 检查ModelFactory.php中的User工厂定义
打开你的ModelFactory.php,找到User模型的工厂定义,重点看verification_token字段的生成逻辑。如果是像下面这样用了返回数组的Faker方法:
$factory->define(App\User::class, function (Faker\Generator $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => bcrypt('secret'), 'remember_token' => str_random(10), 'verified' => 1, 'verification_token' => $faker->words(2), // 这里返回数组,会触发错误! 'admin' => 0, ]; });
$faker->words()默认返回数组,而你的verification_token字段是字符串类型(比如迁移里定义的string),就会抛出Array to string conversion异常。
修复方法:
把返回数组的方法改成生成字符串的方式,比如:
// 方法1:用Faker生成唯一UUID字符串 'verification_token' => $faker->uuid, // 方法2:用Laravel的Str辅助函数生成随机字符串 'verification_token' => \Illuminate\Support\Str::random(40), // 方法3:如果该字段允许为空,直接设为null(和你SQL里的空值对应) 'verification_token' => null,
2. 确认迁移文件中的字段类型
打开创建users表的迁移文件,检查verification_token的定义是否为字符串类型(允许为空):
Schema::create('users', function (Blueprint $table) { // ...其他字段 $table->boolean('verified')->default(0); $table->string('verification_token')->nullable(); // 这里应该是string且nullable $table->boolean('admin')->default(0); // ... });
如果字段类型定义成了json或者其他数组兼容类型,插入数组没问题,但如果是string/varchar,就必须传入字符串或null。
3. 检查播种器代码
如果你的播种器(比如UsersTableSeeder.php)里手动给User模型赋值了数组类型的字段,也会触发这个错误。比如:
// 错误示例:给verification_token传了数组 factory(App\User::class, 10)->create([ 'verification_token' => ['token1', 'token2'], ]);
这种情况要改成传入字符串或null即可。
最后验证
修改完成后,重新运行php artisan db:seed,应该就能正常填充数据了。
内容的提问来源于stack exchange,提问作者Supun Weerasekara
相关产品推荐
相关产品推荐

