Laravel 9更新用户触发SQL Server日期转换异常,求修复方案
Laravel 9 + SQL Server 更新用户日期转换异常修复
问题根源
触发SQLSTATE[22007]错误的核心原因是:SQL Server判断NULL值必须使用IS NULL语法,但Laravel生成的查询错误使用了[deleted_at] = NULL,导致日期类型转换失败。生成的错误查询语句如下:
SELECT count(*) AS aggregate FROM [users] WHERE [email] = user_email AND [id] <> user_id AND [deleted_at] = NULL
修复方法
1. 修正唯一性验证规则
如果问题来源于用户邮箱的唯一性验证,在验证规则中显式指定软删除字段的判断逻辑:
// 控制器验证逻辑或模型的rules方法中 'email' => [ 'required', 'email', \Illuminate\Validation\Rule::unique('users') ->ignore($user->id) ->whereNull('deleted_at'), ]
通过whereNull('deleted_at')强制生成deleted_at IS NULL的正确SQL语法。
2. 自定义SQL Server查询文法
若全局存在这类语法问题,可扩展SQL Server的查询文法:
- 创建自定义文法类:
<?php namespace App\Database\Query\Grammars; use Illuminate\Database\Query\Grammars\SqlServerGrammar; class CustomSqlServerGrammar extends SqlServerGrammar { protected function whereNull($query, $where) { return $this->wrap($where['column']) . ' IS NULL'; } }
- 在
AppServiceProvider的boot方法中注册:
use App\Database\Query\Grammars\CustomSqlServerGrammar; use Illuminate\Support\Facades\DB; public function boot() { DB::connection('sqlsrv')->setQueryGrammar(new CustomSqlServerGrammar()); }
3. 检查软删除配置
确保用户模型正确启用软删除特性:
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class User extends Model { use SoftDeletes; // 其他模型配置... }
正确启用软删除后,Laravel会自动处理deleted_at的NULL判断,避免生成错误SQL。
内容的提问来源于stack exchange,提问作者Rafael Oliveira
相关产品推荐
相关产品推荐

