MoneyBundle

Documentation

Doctrine

MongoDB ODM

When used with an application where the Doctrine MongoDB ODM (and DoctrineMongoDBBundle) is installed, the MoneyBundle defines an appropriate schema allowing Money\Money objects to be embedded within documents with no extra effort.

All that is required is to define a field on your document as an embedded field with the Money\Money type, such as the below example document:

The below example uses Attributes, but you can use any of the ODM's mapping drivers in your application.
<?php

namespace App\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Money\Money;

#[ODM\Document]
class Invoice
{
    #[ODM\EmbedOne(targetDocument: Money::class)]
    public Money $tax_due;

    public function __construct()
    {
        $this->tax_due = Money::USD(0);
    }
}

ORM

When used with an application where the Doctrine ORM (and DoctrineBundle) is installed, the MoneyBundle defines an appropriate database schema allowing Money\Money objects to be used within entities with no extra effort.

All that is required is to define a field on your entity as an embedded field with the Money\Money type, such as the below example entity:

The below example uses Attributes, but you can use any of the ORM's mapping drivers in your application.
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Money\Money;

#[ORM\Entity]
class Invoice
{
    #[ORM\Embedded(class: Money::class)]
    public Money $tax_due;

    public function __construct()
    {
        $this->tax_due = Money::USD(0);
    }
}

Storage and Queries

A Money\Money object is stored as two string fields, matching the data types used internally by the object. With the ORM, the above entity uses tax_due_amount and tax_due_currency_code columns, both VARCHAR(255).

Because the amount is stored as a string, sorting and comparing amounts in queries is done as text, not numerically. This applies to both the ORM and the MongoDB ODM.