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

Laravel启用SoftDeletes时出现Unknown column错误求解决

修复Laravel软删除场景下的Unknown column 'table.deleted_at'错误

问题原因

你的查询逻辑里,子查询已经通过Model的软删除全局作用域过滤了已删除数据(自动添加where model_table.deleted_at is null),但外层的$query同样属于该Model,Laravel会再次自动给外层查询添加软删除过滤条件。此时外层查询的表是子查询的别名sub,但全局作用域仍引用原表名(如model_table),导致SQL尝试查找不存在的model_table.deleted_at列,从而报错。

解决方案

方案1:临时禁用外层查询的软删除全局作用域

因为子查询已经完成了软删除数据的过滤,外层无需重复过滤,直接禁用全局作用域即可:

public function scopeWithRowNumber($query)
{
    $sub = Model::selectRaw('*, @row:=@row+1 as row')
        ->orderBy('some_date', 'desc')->toSql();

    // 禁用软删除全局作用域,避免重复添加过滤条件
    $query->withoutGlobalScope(\Illuminate\Database\Eloquent\SoftDeletingScope::class)
          ->from(DB::raw("({$sub}) as sub"));
}

方案2:优化子查询的行号初始化(可选)

另外注意,你的行号变量@row没有初始化,可能导致行号计算异常,建议在子查询中添加初始化逻辑:

public function scopeWithRowNumber($query)
{
    // 初始化行号变量@row为0
    $sub = Model::selectRaw('*, @row:=@row+1 as row')
        ->fromRaw('model_table, (select @row:=0) as row_init')
        ->orderBy('some_date', 'desc')->toSql();

    $query->withoutGlobalScope(\Illuminate\Database\Eloquent\SoftDeletingScope::class)
          ->from(DB::raw("({$sub}) as sub"));
}

补充说明

如果需要保留外层查询的软删除过滤(虽然子查询已经处理,但特殊场景下可能需要),可以手动指定别名对应的deleted_at列,但这种情况没必要,优先使用方案1即可。

内容的提问来源于stack exchange,提问作者Cutis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:45:34