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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:05:10