Laravel API开发遇SQLSTATE[22007]错误:布尔字段值类型不匹配
问题排查与解决:SQLSTATE[22007] 字段值类型不匹配错误
错误原因
你的错误本质是布尔字段的赋值类型不匹配:
- 迁移文件中
products表的show字段定义为boolean类型,在MySQL中该类型底层存储为tinyint(1),仅接受0/1或原生布尔值true/false。 - 工厂代码中通过
$this->faker->randomElement(['true', 'false'])生成的是字符串类型的'true'/'false',MySQL无法将字符串直接转换为合法的整数值,因此抛出1366 Incorrect integer value错误。
解决方案
方案1:直接生成布尔值(推荐)
修改工厂中的show字段生成逻辑,使用Faker内置的boolean()方法直接返回布尔值:
public function definition() { $show = $this->faker->boolean(); // 直接生成true/false布尔值 $size_type = $this->faker->randomElement(['ml', 'liter', 'gm', 'kg', 'oz', 'lb']); $status = $this->faker->randomElement(['Y', 'N']); $price = $this->faker->numberBetween($min = 10, $max = 9999); return [ 'catalog_id' => Catalog::factory(), 'image' => $this->faker->imageUrl($width = 640, $height = 480, 'clothes'), 'name' => 'iPhone 14 Pro Max', 'size' => $this->faker->numberBetween($min = 10, $max = 5000), 'size_type' => $size_type, 'price' => $price, 'discounted_price' => $status == 'Y' ? $this->faker->numberBetween($min = $price * 0.6, $max = $price * 0.9) : null, 'show' => $show, ]; }
方案2:字符串转布尔值(兼容原有逻辑)
如果需要保留原有字符串数组的逻辑,在返回数组时将字符串转换为布尔值:
public function definition() { $show = $this->faker->randomElement(['true', 'false']); // ... 其他代码不变 return [ // ... 其他字段不变 'show' => $show === 'true', // 将字符串转为布尔值 ]; }
额外优化建议
迁移文件中catalog_id定义为string类型,但工厂中使用Catalog::factory()关联模型,若Catalog的主键是自增整数,建议将迁移中的catalog_id改为外键类型以保持类型一致:
// 替换原有的$table->string('catalog_id'); $table->foreignId('catalog_id')->constrained();
内容的提问来源于stack exchange,提问作者I. Antonov
相关产品推荐
相关产品推荐

