Laravel模型中如何覆盖Accessor属性行为以返回原始字段值?
Laravel模型访问器:动态切换
price字段的格式化/原始值 下面提供几种在模型实例状态下直接控制访问器行为的方案,满足你既保留price字段名,又能按需获取原始值的需求:
方案1:直接获取原始数据库值修改
Laravel模型提供了getOriginal()方法,可以直接读取数据库中存储的原始字段值,跳过访问器的格式化逻辑。修改代码如下:
$product = Product::find(1); // 获取未经过访问器格式化的原始价格 $originalPrice = $product->getOriginal('price'); // 修改原始值并赋值 $product->price = preg_replace('/[^0-9]/', '', $originalPrice); $product->save();
方案2:给访问器添加动态开关
在模型中新增一个控制属性,让访问器根据开关状态返回格式化值或原始值:
// Product模型内 protected $formatPrice = true; public function getPriceAttribute() { // 根据开关决定返回格式化值还是原始值 return $this->formatPrice ? number_format($this->attributes['price']) : $this->attributes['price']; } // 新增切换开关的方法,支持链式调用 public function useRawPrice() { $this->formatPrice = false; return $this; } // 可选:恢复格式化的方法 public function useFormattedPrice() { $this->formatPrice = true; return $this; }
使用时只需先调用开关方法,就能直接访问原始值:
$product = Product::find(1)->useRawPrice(); // 此时$product->price返回原始值,可直接修改 $product->price = preg_replace('/[^0-9]/', '', $product->price); // 若后续需要格式化价格,可调用恢复方法 $product->useFormattedPrice();
方案3:临时移除/恢复访问器
Laravel 8及以上版本支持removeMutator()方法,可临时移除指定字段的访问器,用完后再恢复:
$product = Product::find(1); // 临时移除price字段的访问器 $product->removeMutator('price'); // 此时访问$product->price为原始值 $product->price = preg_replace('/[^0-9]/', '', $product->price); // 恢复访问器(需重新定义逻辑) $product->addMutator('price', function () { return number_format($this->attributes['price']); });
推荐方案
优先选择方案1或方案2:方案1简单直接,适合单次获取原始值的场景;方案2灵活性更高,适合需要多次切换格式化状态的业务逻辑。
内容的提问来源于stack exchange,提问作者Denny Rustandi
相关产品推荐
相关产品推荐

