Laravel API开发:如何映射请求字段与数据库列实现更新?
更优实现方案
方案一:利用Form Request做字段映射
创建对应的数据请求类(比如StoreItemRequest或UpdateItemRequest),在prepareForValidation方法里完成前端字段到数据库字段的转换,后续验证和赋值都能直接复用数据库字段名:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UpdateItemRequest extends FormRequest { public function authorize() { return true; // 根据实际权限逻辑调整 } public function rules() { return [ 'price_paid' => 'nullable|numeric', // 其他数据库字段的验证规则... ]; } protected function prepareForValidation() { // 把前端传入的PricePaid映射为price_paid,合并到请求数据中 if ($this->has('PricePaid')) { $this->merge([ 'price_paid' => $this->PricePaid ]); // 可选:移除原前端字段,避免干扰后续逻辑 $this->request->remove('PricePaid'); } // 其他字段的映射逻辑也在这里统一处理 } }
控制器里直接调用即可:
public function update(UpdateItemRequest $request, Item $item) { $item->update($request->validated()); return new ItemResource($item); }
方案二:模型层统一处理字段映射
如果不想在请求层处理,可以在模型里定义字段映射关系,重写fill方法来自动转换字段名:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $fillable = ['price_paid']; // 定义前端字段到数据库字段的映射表 protected $frontendToDbMap = [ 'PricePaid' => 'price_paid', // 其他字段映射... ]; public function fill(array $attributes) { $mappedAttributes = []; foreach ($attributes as $key => $value) { // 匹配映射表,没有匹配的字段则保留原键 $mappedKey = $this->frontendToDbMap[$key] ?? $key; $mappedAttributes[$mappedKey] = $value; } return parent::fill($mappedAttributes); } }
控制器里直接传入请求数据即可:
public function update(Request $request, Item $item) { // 先验证前端字段 $validated = $request->validate([ 'PricePaid' => 'nullable|numeric', // 其他前端字段的验证规则 ]); $item->fill($validated)->save(); return new ItemResource($item); }
方案三:访问器+修改器实现双向映射
如果需要读写操作都统一处理字段转换,可以用Laravel的访问器和修改器,甚至能替代部分Resource的作用:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $fillable = ['price_paid']; // 追加到模型输出的字段,替代Resource的部分映射逻辑 protected $appends = ['PricePaid']; // 访问器:读取时把数据库字段price_paid转为前端字段PricePaid public function getPricePaidAttribute($value) { return $value; // 如需格式化(如金额处理)可在这里修改 } // 修改器:写入时把前端字段PricePaid转为数据库字段price_paid public function setPricePaidAttribute($value) { $this->attributes['price_paid'] = $value; } }
控制器里直接使用前端字段操作:
public function update(Request $request, Item $item) { $validated = $request->validate([ 'PricePaid' => 'nullable|numeric', ]); $item->update($validated); return response()->json($item); // 输出会自动包含PricePaid字段 }
内容的提问来源于stack exchange,提问作者user3534653
相关产品推荐
相关产品推荐

