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
相关产品推荐
相关产品推荐

