---
title: "Eloquent casty a schéma — Money for Laravel | Roundly"
description: "Castujte atribúty na Money v jednom či dvoch stĺpcoch, vytvárajte presné decimal stĺpce makrami schémy a správne sa nad nimi dopytujte."
url: https://roundly-consulting.com/sk/open-source/navody/money-for-laravel/eloquent-a-schema
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Money for Laravel](https://roundly-consulting.com/sk/open-source/navody/money-for-laravel.md)

# 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:

```php
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:

```php
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

```php
$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.
- Casty objekt Money nikdy necachujú: každé čítanie ho zostaví z aktuálnych stĺpcov, konfigurácie alebo atribútu, takže prečítanie $order->total nezafixuje jeho menu pre neskorší save() ani toArray().
- 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/money-for-laravel.md)
