Laravel如何在数据入库前过滤输入?统一姓名格式
Laravel 中存入数据库前格式化姓名的方法
在Laravel里,要把姓名统一处理成首字母大写、其余小写的格式,有几种常用的实现方式,根据你的场景选择即可:
方法一:模型修改器(推荐,全局生效)
在对应的用户模型(比如App\Models\User)中定义字段修改器,只要通过模型操作数据,就会自动格式化姓名:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { // 定义name字段的修改器 public function setNameAttribute($value) { // ucwords() 支持多词姓名,比如输入"JOHN DOE"会转为"John Doe" // 单字姓名用 ucfirst(strtolower($value)) 也可,效果一致 $this->attributes['name'] = ucwords(strtolower($value)); } }
之后不管是用$user->name = 'alice smith';、User::create()还是User::update(),name字段都会自动处理后存入数据库。
方法二:表单请求预处理
如果使用了自定义表单请求类(比如注册用的RegisterRequest),可以在验证前先格式化输入:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class RegisterRequest extends FormRequest { // 验证前预处理输入数据 protected function prepareForValidation() { $this->merge([ 'name' => ucwords(strtolower($this->input('name'))), ]); } // 验证规则 public function rules() { return [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]; } }
这种方式会在验证阶段就把姓名处理好,后续存入数据库的就是格式化后的值。
方法三:控制器中直接处理
如果场景简单,也可以在控制器的存储/更新方法里手动处理输入:
namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; class UserController extends Controller { public function store(Request $request) { $validatedData = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]); // 格式化姓名字段 $validatedData['name'] = ucwords(strtolower($validatedData['name'])); User::create($validatedData); return redirect()->route('dashboard'); } }
内容的提问来源于stack exchange,提问作者CH405
相关产品推荐
相关产品推荐

