You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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更准确。

步骤如下:

  1. 在你的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);
    }
}
  1. 之后查询模型时,只需要获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:09:59