You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:33:14