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,
];
}| Cast | Ukladá |
|---|---|
AsMoney::class | Stĺ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::class | Jeden JSON stĺpec s minor a menou — na snapshoty. |
AsCurrency::class | Stĺ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 kryptomienOdoslaní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.