Define Money Fomat in Laravel

Illuminate blueprints do not support money columns. AFAIK, the money column type itself is only supported in a couple of DBMSes.

What you can do is issue an ALTER TABLE statement to the database after the initial CREATE statement:

Schema::create('my_table', function(Blueprint $table) {
    $table->decimal('my_money_column', 999, 2);
    // ... the rest of the column definitions
});

DB::statement("
    ALTER TABLE my_table ALTER COLUMN my_money_column
        SET DATA TYPE MONEY;
");

Beware, though, as this will (probably) break cross-DBMS compatibility of your migration scripts.


I would suggest not using a float value to store currency as decimals, since floats don't act exactly as you would expect them to, due to the way they are stored in the system.

You would be much better off storing the value in "kuruş" (the subunit of Turkish Lira), as it will be much, much easier in the long run.

In other words, storing the lowest unit you think will be ever required, like storing Centi-meters instead of Meters (Centi is originally Greekish name for "0.01" number).

Secondly, if you're using Eloquent you can use mutators/accessors on the Model e.g.

public function getPriceAttribute($price)
{
    return $price / 100;
}

public function setPriceAttribute($price)
{
    $this->attributes['price'] = $price * 100;
}

That way you don't have to manually convert the price.


You can try defining your price like this

$table->decimal('price',9,3);

Where,

9 is the precision, ie 1234567.89 has a precision of 9

3 is the number of decimal places, ie 123456.789 has a scale of 3

In other words, if we use less decimal-places than 3, we can use remaining for real-number places.

You can refer to this link for about precision and scale of database How do I interpret precision and scale of a number in a database?

Tags:

Laravel 5.1