Laravel Eloquent中使用DB::raw查询如何获取驼峰式别名?
解决Laravel DB::raw别名自动转小写的问题
这个问题的核心原因是:当你使用DB::raw()时,Laravel不会对里面的SQL别名做格式处理,而是直接传递给数据库执行。很多数据库(比如PostgreSQL默认配置、MySQL开启lower_case_table_names时)会将未被引号包裹的标识符(包括列别名)自动转换为小写,这就导致你定义的PhotoImage变成了photoimage,而普通select()里的别名因为Laravel内部做了处理,所以能保持驼峰格式。
下面是几种可行的解决方案:
1. 给DB::raw里的别名添加引号
根据你使用的数据库类型,选择对应的引号包裹别名:
- PostgreSQL:使用双引号
"包裹别名 - MySQL:使用反引号
`包裹别名
修改后的查询代码示例(以PostgreSQL为例):
IDProofDetails::select( 'idproof_details.idproof_id as IDNumber', 'idproof_types.lcode_id_proof_name as idProofType', DB::raw("ENCODE(CONVERT_TO(photo, 'UTF-8'), 'base64') as \"PhotoImage\"") ) ->leftJoin('idproof_types', 'idproof_types.id', '=', 'idproof_details.id_proof_type_id') ->get();
如果是MySQL,只需要把引号换成反引号:
DB::raw("ENCODE(CONVERT_TO(photo, 'UTF-8'), 'base64') as `PhotoImage`")
2. 使用selectRaw替代DB::raw
你也可以用selectRaw()方法来替代DB::raw(),写法更简洁,同样需要给别名加引号:
IDProofDetails::select( 'idproof_details.idproof_id as IDNumber', 'idproof_types.lcode_id_proof_name as idProofType' ) ->selectRaw('ENCODE(CONVERT_TO(photo, \'UTF-8\'), \'base64\') as "PhotoImage"') ->leftJoin('idproof_types', 'idproof_types.id', '=', 'idproof_details.id_proof_type_id') ->get();
这样修改后,查询返回的结果里PhotoImage就能保持你想要的驼峰格式了:
[ "IDNumber" => "df23redf", "idProofType" => "AADHAR", "PhotoImage" => null ]
内容的提问来源于stack exchange,提问作者arshad
相关产品推荐
相关产品推荐

