Laravel:如何在Query Builder中用Mutator合并字段并转大写?
解决Laravel Query Builder/Eloquent合并字段并转大写的问题
嘿,我来帮你搞定这个需求!在Laravel里,你有两种实用的方式来实现把first_name和last_name合并成大写的name字段,下面分别给你详细说明:
方法一:直接用Query Builder在数据库层面处理
如果你的查询直接用DB门面的Query Builder,可以借助SQL的CONCAT和UPPER函数来完成拼接和转大写,这种处理是在数据库端完成的,性能更优:
$users = DB::table('users') ->select( 'id', // 保留你需要的其他字段 DB::raw('CONCAT(UPPER(first_name), " ", UPPER(last_name)) AS name') ) ->get();
这样查询返回的集合里,每个结果都会带有name字段,值就是大写的全名,比如JOHN DOE。
方法二:用Eloquent模型的访问器(Accessor)
如果你的项目用了Eloquent模型(Laravel推荐的开发方式),可以给模型添加一个访问器来动态生成name字段。这里要注意:你提到的Mutator通常是用来处理「设置字段」(比如存入数据库时修改值),而获取动态字段用Accessor更准确。
步骤如下:
- 在你的User模型中添加访问器方法,并把
name加入$appends数组(让它在模型转数组/JSON时自动包含):
namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { // 让访问器字段自动包含在模型的数组/JSON输出中 protected $appends = ['name']; /** * 获取大写的全名 */ public function getNameAttribute() { return strtoupper($this->first_name) . ' ' . strtoupper($this->last_name); } }
- 之后查询模型时,只需要获取
first_name和last_name,访问器会自动生成name字段:
$users = User::select('id', 'first_name', 'last_name')->get(); // 访问单个用户的name属性 echo $users[0]->name; // 输出类似 "JOHN DOE"
两种方法的选择建议
- 如果你只在某一次查询中需要这个
name字段,用Query Builder的方式更高效,减少PHP层面的处理。 - 如果你在多个地方都需要用到这个大写全名,用访问器的方式更灵活,后续修改格式(比如加中间名)只需要改一次访问器方法,所有用到的地方都会生效。
内容的提问来源于stack exchange,提问作者Aslam H
相关产品推荐
相关产品推荐

