
Laravel 升级后 Eloquent 的整数型 where 条件(如 where('col', 1))可能因 MySQL 严格模式变化而失效,根本原因在于数据库驱动对类型隐式转换的处理差异,启用 strict 模式可恢复预期行为。
laravel 升级后 eloquent where 查询整数条件失效的解决方案:laravel 升级后 eloquent 的整数型 `where` 条件(如 `where('col', 1)`)可能因 mysql 严格模式变化而失效,根本原因在于数据库驱动对类型隐式转换的处理差异,启用 strict 模式可恢复预期行为。
在 Laravel 5.3+ 版本中,框架默认启用了更严格的数据库类型校验机制,尤其当使用带表别名的列(如 'categories.is_list')配合整数值进行 WHERE 查询时,底层 PDO 或 MySQL 驱动可能因字段类型(如 TINYINT(1) 常被 Laravel 视为布尔)与传入参数类型不匹配,导致查询结果为空或逻辑异常——尽管 SQL 语句本身能执行,但 MySQL 在严格模式下会拒绝隐式类型转换,从而影响查询准确性。
根本解决方法是启用 MySQL 严格模式:
修改 config/database.php 中 MySQL 连接配置的 strict 选项:
'mysql' => [
// ... 其他配置
'strict' => true, // ✅ 确保此项为 true(Laravel 5.3+ 默认值)
'engine' => null,
],
⚠️ 注意:若当前值为 false,请改为 true;该设置会强制 MySQL 拒绝不安全的隐式类型转换(例如将字符串 '1' 与 TINYINT 字段比较),从而让 Eloquent 的整数参数(如 1)被正确绑定为整型,避免因类型失配导致的查询遗漏。
此外,推荐同步检查以下两点以增强健壮性:
- 确认字段实际类型:在数据库中执行 DESCRIBE categories;,确保 is_list 字段为 TINYINT(1) 或 BOOLEAN(Laravel 会自动映射为布尔),而非 VARCHAR 等字符串类型;
-
避免别名歧义(进阶):若仍存在问题,可改用原生查询绑定或显式类型转换:
->whereRaw('categories.is_list = ?', [(int) 1])
启用 strict => true 是全局、无侵入的修复方案,无需逐条修改数千个 Eloquent 查询,且符合 Laravel 最佳实践——它不仅解决当前问题,还预防未来因类型混淆引发的数据一致性风险。











