Laravel 8如何在Model::select()中添加字符串作为查询列?
在Laravel 8查询结果中添加字符串常量的正确写法
你原来的写法失效是因为Laravel的select()会把传入的普通字符串解析成数据库字段名,导致"'EVENT' as type"被误判为查询名为'EVENT'的字段。下面是几种可行的解决办法:
方法一:使用DB::raw()包裹原生SQL片段
直接把需要的字符串常量片段用DB::raw()包裹,让Laravel原样解析这段SQL:
Event::select('name', 'created_at', DB::raw("'EVENT' as type"))->get();
方法二:使用selectRaw()配合参数绑定(更安全)
如果需要避免硬编码字符串(或者养成参数绑定的好习惯),可以用selectRaw()并传入参数数组:
Event::selectRaw('name, created_at, ? as type', ['EVENT'])->get();
这种方式会自动处理字符串转义,避免SQL注入风险,哪怕是固定常量也推荐这么写。
方法三:集合层面添加字段(内存处理)
如果不需要在数据库查询阶段返回这个字段,也可以先查询基础数据,再通过集合的map()方法添加:
Event::select('name', 'created_at')->get()->map(function ($event) { $event->type = 'EVENT'; return $event; });
注意这种方式的type字段是在PHP内存中添加的,不会出现在原始的SQL查询语句里。
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

