Laravel查询时转status为葡萄牙语及GET请求列值变更问题
问题解决方案
一、在数据库查询阶段直接转换status字段为葡萄牙语
完全可以在查询阶段通过SQL的CASE语句实现转换,不用等到获取数据后再处理。在Laravel中借助DB::raw()嵌入原生SQL逻辑即可:
对应翻译映射:
- 'approve' → 'aprovado'
- 'waiting' → 'aguardando'
修改后的完整方法代码:
use Illuminate\Support\Facades\DB; public function pdvs() { $forms = Form::query() ->where('forms.distributor_id', '!=', 1) ->join('vouchers', 'forms.id', '=', 'vouchers.form_id') ->select( 'forms.cnpj', DB::raw("CASE forms.status WHEN 'approve' THEN 'aprovado' WHEN 'waiting' THEN 'aguardando' ELSE forms.status END AS status"), 'vouchers.code', 'vouchers.quantityLiterPurchased' ) ->get(); return response()->json($forms); }
注:去掉了多余的json_decode($forms),get()返回的集合可被Laravel直接序列化为JSON,无需额外解码。
二、GET操作时列值变更问题排查
列值莫名变更通常有以下几个常见原因,按优先级排查:
- 模型访问器干扰:检查
Form模型是否定义了getStatusAttribute或其他字段的访问器,这类方法会自动修改字段返回值 - 序列化阶段修改:在
get()后直接打印$forms->toArray(),查看原始查询结果是否已变更,排除response()->json()过程中的修改 - 数据库触发器:检查
forms或vouchers表是否存在自动修改字段的触发器 - 字段名冲突:确认关联的两张表是否有同名字段(比如
vouchers也有status),若有需明确指定表名(原代码已指定forms.status,此点大概率无问题)
内容的提问来源于stack exchange,提问作者gobs
相关产品推荐
相关产品推荐

