NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Money for Laravel

Eloquent casty a schéma

Castujte atribúty modelu priamo na Money. Casty sú striktné: priradiť možno len Money alebo null, a to len v registrovanej mene:

use RoundlyConsulting\Money\Casts\AsCurrency;
use RoundlyConsulting\Money\Casts\AsMoney;
use RoundlyConsulting\Money\Casts\AsMoneyJson;

protected function casts(): array
{
    return [
        'price'            => AsMoney::class,                          // price + price_currency
        'compare_at_price' => AsMoney::currencyColumn('currency'),     // shared currency column
        'budget'           => AsMoney::fixedCurrency('EUR'),           // amount column only
        'store_credit'     => AsMoney::configCurrency('shop.currency'),
        'total'            => AsMoney::attributeCurrency('shop_currency'),
        'snapshot'         => AsMoneyJson::class,                      // {"minor":"1050","currency":"EUR"}
        'currency'         => AsCurrency::class,
    ];
}
CastUkladá
AsMoney::classStĺpec sumy + stĺpec {key}_currency (predvolené).
AsMoney::currencyColumn('currency')Suma + pomenovaný stĺpec meny, ktorý môže byť zdieľaný.
AsMoney::fixedCurrency('EUR')Len suma; mena je konštanta.
AsMoney::configCurrency('shop.currency')Len suma; mena sa pri čítaní načíta z konfigurácie.
AsMoney::attributeCurrency('shop_currency')Len suma; mena pochádza z iného atribútu.
AsMoneyJson::classJeden JSON stĺpec s minor a menou — na snapshoty.
AsCurrency::classStĺpec s kódom meny ⇄ registrovaný objekt Currency.

Makrá schémy

$table->money() vytvorí znamienkový stĺpec sumy decimal(38, 0) a stĺpec meny; zvyšok pokryjú moneyJson() a currencyCode(). Makrá sa registrujú vždy, pretože od nich závisia publikované migrácie:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->money('price');                                         // decimal(38,0) + price_currency
    $table->money('compare_at_price', currency: 'currency', nullable: true);
    $table->money('budget', currency: false);
    $table->moneyJson('snapshot', nullable: true);
    $table->currencyCode('shop_currency');
    $table->timestamps();
});
  • money($column, currency: null, nullable: false) — vráti stĺpec sumy. Reťazec v currency pomenuje stĺpec, ktorý môže byť zdieľaný (v blueprinte sa pridá raz); currency: false nepridá žiadny.
  • moneyJson($column, nullable: false) — jsonb v PostgreSQL, json v MySQL, text v SQLite.
  • currencyCode($column = 'currency', nullable: false) — varchar(schema.currency_length).

Zápis a dopyty

$product->price = Money::ofMajor('99.90', 'EUR');   // writes price + price_currency
$product->price = 9990;                             // throws InvalidMoneyValue — a number has no currency

// compare_at_price shares the "currency" column: set the currency first to change it on purpose
$product->fill(['currency' => 'USD', 'compare_at_price' => Money::ofMajor('120', 'USD')]);

Product::query()->orderBy('price')->get();                          // numeric order
Product::query()->where('price', '>', $threshold->minor())->get();  // exact filter

$sum = Product::query()->where('price_currency', 'EUR')->sum('price');
Money::ofMinor($sum, 'EUR');                                         // exact total — group sums by currency
  • Holý int alebo reťazec vyhodí InvalidMoneyValue — číslo nemá menu ani jednotku.
  • Zdieľaný stĺpec meny sa nikdy potichu neprepíše na inú menu: zápis USD vedľa sumy v EUR vyhodí CurrencyMismatch. Ak menu meníte zámerne, nastavte najprv stĺpec meny.
  • Viac číslic, ako povoľuje schema.precision, vyhodí InvalidMoneyValue; v SQLite sa sumy nad int64 odmietnu, namiesto toho, aby sa potichu uložili ako float.
  • Opätovné priradenie rovnakej Money nespustí UPDATE — sledovanie zmien porovnáva hodnoty, nie bajty.
  • orderBy(), where() aj sum() nad peňažnými stĺpcami sú číselne presné, aj nad 2^53 minoritných jednotiek, kde by double zaokrúhľoval; súčty zoskupujte podľa meny. Testy to overujú na SQLite, PostgreSQL aj MySQL 8.

Existujúce bigint stĺpce so sumami fungujú s AsMoney ďalej; nad int64 zápis odmietne databáza. AsMoneyJson používajte na snapshoty a dvojstĺpcové sumy na všetko, podľa čoho filtrujete alebo radíte.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.