PHPackages                             youngkingoo6/laravel-amount - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. youngkingoo6/laravel-amount

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

youngkingoo6/laravel-amount
===========================

v1.0.1(4y ago)021PHP

Since Sep 18Pushed 4y ago1 watchersCompare

[ Source](https://github.com/Youngkingoo6/laravel-amount)[ Packagist](https://packagist.org/packages/youngkingoo6/laravel-amount)[ RSS](/packages/youngkingoo6-laravel-amount/feed)WikiDiscussions master Synced 1w ago

READMEChangelog (1)DependenciesVersions (4)Used By (0)

laravel-amount
==============

[](#laravel-amount)

> 原作者:

背景
--

[](#背景)

系统中涉及到金额的字段，View 层表现的时候一般都是以**元**为单位使用小数形式展示，不过 Domain 层存储时从空间、性能、容错角度出发，经常以**分**为单位，用整型来存储。

在 Lavarel 中，可以在 Model 中添加属性方法进行转换

```
public function getAmountAttribute($value)
{
    return $value / 100;
}

public function setAmountAttribute($value)
{
    $this->attributes['amount'] = (int)($value * 100);
}
```

不过涉及金额的字段比较多时就需要定义很多相同逻辑的函数，本项目即将该逻辑抽出为 Trait，简化金额字段相关的处理。

原理
--

[](#原理)

将转换逻辑封装在 AmountTrait 中，覆写 Model 类的 getMutatedAttributes, mutateAttributeForArray, getAttributeValue 及 setAttribute 方法，当访问相关字段时自动进行转换处理。

```
public static $amountTimes = 100;

public function getMutatedAttributes()
{
    $attributes = parent::getMutatedAttributes();
    return array_merge($attributes, $this->getAmountFields());
}

protected function mutateAttributeForArray($key, $value)
{
    return (in_array($key, $this->getAmountFields()))
        ? (function_exists('bcdiv') ? bcdiv($value, self::$amountTimes, 2) : $value / self::$amountTimes)
        : parent::mutateAttributeForArray($key, $value);
}

public function getAttributeValue($key)
{
    $value = parent::getAttributeValue($key);
    if(function_exists('bcdiv')){
        $value = bcdiv($value, self::$amountTimes,2);
    }else{
        $value = $value / self::$amountTimes;
    }

    return $value;
}

public function setAttribute($key, $value)
{
    if (in_array($key, $this->getAmountFields())) {
          if(function_exists('bcmul')){
              $value = (int)bcmul($value, self::$amountTimes);
          }else{
              $value = (int)($value * self::$amountTimes);
          }
    }
    parent::setAttribute($key, $value);
}

public function getAmountFields()
{
    return (property_exists($this, 'amountFields')) ? $this->amountFields : [];
}
```

依赖
--

[](#依赖)

Laravel &gt;= 5.2

安装
--

[](#安装)

```
composer require "youngkingoo6/laravel-amount:dev-master"

```

使用
--

[](#使用)

1. 在 Model 中引用 AmountTrait

```
use Youngkingoo6\LaravelAmount\Traits\AmountTrait;
```

2. 使用 AmountTrait

```
use AmountTrait;
```

3. 定义金额字段（本例中为 amount）

```
protected $amountFields = ['amount'];
```

4. 完成

之后读取 amount 字段时，该字段的内容会自动从数据库的**分**转换为**元**，向其赋值时反之从**元**转换为**分**。

5. 中文大写

如需转换为中文金额大写，只需在模型上调用的字段后面加 '\_cny' 即可返回大写金额。

```
$model->amount_cny;

```

如果不想定义 $amountFields 字段，也可以直接调用修改器

```
$model->cny;

```

FAQ
---

[](#faq)

### 和别的 trait 中方法冲突

[](#和别的-trait-中方法冲突)

以 setRawAttributes 为例（此为之前方案，目前并未覆写此方法，仅为举例，其他方法原理相同）

1. 将冲突的方法分别重命名

```
use AmountTrait, BTrait {
    AmountTrait::setRawAttributes as amountTraitSetRawAttributes;
    BTrait::setRawAttributes as BTraitSetRawAttributes;
}
```

2. 在 Model 中定义该冲突的方法，根据情况分别调用别名方法

```
public function setRawAttributes(array $attributes, $sync = false)
{
    $this->BTraitSetRawAttributes($attributes, $sync);
    $attributes = $this->getAttributes();
    $this->amountTraitSetRawAttributes($attributes, $sync);
}
```

> 注意这里 $attributes 可能已被改变，所以再次使用时要重新取得最新值

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor1

Top contributor holds 50% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1822 days

Total

2

Last Release

1705d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/10043794?v=4)[Yking](/maintainers/Youngkingoo6)[@Youngkingoo6](https://github.com/Youngkingoo6)

---

Top Contributors

[![hao-li](https://avatars.githubusercontent.com/u/11334645?v=4)](https://github.com/hao-li "hao-li (8 commits)")[![Youngkingoo6](https://avatars.githubusercontent.com/u/10043794?v=4)](https://github.com/Youngkingoo6 "Youngkingoo6 (8 commits)")

### Embed Badge

![Health badge](/badges/youngkingoo6-laravel-amount/health.svg)

```
[![Health](https://phpackages.com/badges/youngkingoo6-laravel-amount/health.svg)](https://phpackages.com/packages/youngkingoo6-laravel-amount)
```

###  Alternatives

[cloudflare/cloudflare-magento

Cloudflare Plugin for Magento2

5371.9k](/packages/cloudflare-cloudflare-magento)[bertptrs/phpstreams

A streams library for PHP based on the Java 8 Streams API.

883.2k](/packages/bertptrs-phpstreams)[cheprasov/php-parallel

The class allows you to run multiple operations parallel in different processes and send results to the main process. Useful if you need to run multiple independent operations simultaneously, instead of sequential execution, or if you run several independent queries, for example, queries to different data bases

1712.5k5](/packages/cheprasov-php-parallel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
