
Laravel 升级后 Eloquent 的整数型 where 条件(如 where('col', 1))失效,本质是 MySQL 严格模式启用后类型校验增强所致;只需在 config/database.php 中将 MySQL 连接的 'strict' => true 设为 false 即可恢复兼容性。
laravel 升级后 eloquent 的整数型 where 条件(如 `where('col', 1)`)失效,本质是 mysql 严格模式启用后类型校验增强所致;只需在 `config/database.php` 中将 mysql 连接的 `'strict' => true` 设为 `false` 即可恢复兼容性。
当你从 Laravel 5.2 升级到较新版本(如 5.7+ 或 6.0+),Eloquent 默认启用了更严格的 SQL 模式(尤其是 MySQL 驱动),这导致底层查询构建器对列类型与绑定值类型的匹配要求显著提高。例如:
Category::where('categories.is_list', 1)->get();在严格模式下,若数据库字段 categories.is_list 是 TINYINT(1) 或 ENUM 类型,而传入的 1 被视为整数,但 MySQL 在某些严格配置下可能拒绝隐式类型转换(尤其涉及 WHERE 子句中的列别名或关联表字段),从而返回空结果或触发不预期的行为。
✅ 根本解决方式(全局生效,无需逐条修改查询):
编辑 config/database.php,定位到 mysql 连接配置块,将:
'mysql' => [
// ...
'strict' => true, // ← 默认新项目/升级后常为 true
// ...
],改为:
'mysql' => [
// ...
'strict' => false, // ← 恢复宽松模式,兼容旧有整数 where 用法
// ...
],⚠️ 注意事项:
- 修改后需运行 php artisan config:clear 清除配置缓存;
- strict => false 并非安全退步,而是回归 Laravel 5.2 的默认行为——它允许 MySQL 执行合理的隐式类型转换(如 INT ↔ '1'),适用于绝大多数业务场景;
- 若你依赖严格模式进行数据完整性校验(如防止 "abc" 插入 INT 字段),建议仅对特定连接关闭 strict,或通过模型 $casts 显式定义类型(如 'is_list' => 'boolean'),而非全局禁用;
- 更健壮的长期方案是逐步将关键查询显式类型化,例如使用 whereInteger()(Laravel 9+)或 whereRaw('categories.is_list = ?', [1]),但 strict => false 是最快速、零侵入的兼容性修复。
总之,这不是 Eloquent 的 Bug,而是 MySQL 驱动行为随 Laravel 版本演进而收紧的结果。通过调整数据库连接的 strict 配置,即可一键恢复数千条原有查询的正常执行。


















