コンテンツにスキップ

currencies テーブル定義

概要

システム全体で使用する通貨情報を管理するマスターテーブル。基軸通貨の設定と、有効化する通貨の管理を行う。

用途: 商品価格、注文、決済で使用する通貨を管理。現時点では基準通貨方式(1つの基軸通貨のみ)を採用。

テーブル情報

項目
テーブル名 currencies
エンジン InnoDB
文字セット utf8mb4
照合順序 utf8mb4_unicode_ci
コメント 通貨マスター

カラム定義

カラム名 NULL デフォルト キー 説明
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PK 主キー
currency_code VARCHAR(3) NOT NULL - UNIQUE ISO 4217通貨コード(JPY, USD, EUR等)
currency_name VARCHAR(100) NOT NULL - - 通貨名(日本円、米ドル、ユーロ等)
currency_symbol VARCHAR(10) NOT NULL - - 通貨記号(¥, $, €等)
is_base_currency BOOLEAN NOT NULL FALSE INDEX 基軸通貨フラグ
is_active BOOLEAN NOT NULL FALSE INDEX 有効フラグ
sort_order INT NULL NULL - 表示順序
created_at TIMESTAMP NULL NULL - 作成日時
updated_at TIMESTAMP NULL NULL - 更新日時

インデックス

種別 名称 対象カラム 説明
PRIMARY KEY pk_currencies id 主キー
UNIQUE KEY uk_currency_code currency_code 通貨コードの重複防止
INDEX idx_base_currency is_base_currency 基軸通貨検索
INDEX idx_active is_active 有効通貨検索

外部キー制約

なし(マスターテーブルのため)

リレーション

このテーブルは他のテーブルから参照される:

  • products: 将来的に商品ごとに通貨を指定する場合に参照
  • orders: 注文時の通貨を記録(将来実装)
  • payments: 決済時の通貨を記録(将来実装)

データ例

id currency_code currency_name currency_symbol is_base_currency is_active sort_order
1 JPY 日本円 ¥ TRUE TRUE 1
2 USD 米ドル $ FALSE FALSE 2
3 EUR ユーロ FALSE FALSE 3
4 GBP 英ポンド £ FALSE FALSE 4
5 CNY 人民元 ¥ FALSE FALSE 5

備考・注意事項

ISO 4217準拠

  • 通貨コード: ISO 4217で定義された3文字の通貨コード
  • 主要通貨: JPY, USD, EUR, GBP, CNY, AUD, CAD, CHF等
  • 参考: https://www.iso.org/iso-4217-currency-codes.html

基軸通貨の制約

アプリケーション層での制御

  • 1つのみ: is_base_currency = TRUEのレコードは1つのみ
  • 実装: Eloquent Modelのバリデーションで制御
  • 変更時: 新しい基軸通貨を設定する際は、既存の基軸通貨を自動的にFALSEに更新
// 基軸通貨設定時のバリデーション例
public function setAsBaseCurrency(): void
{
    DB::transaction(function () {
        // 既存の基軸通貨を解除
        Currency::where('is_base_currency', true)->update(['is_base_currency' => false]);

        // 新しい基軸通貨を設定
        $this->is_base_currency = true;
        $this->is_active = true; // 基軸通貨は必ず有効
        $this->save();
    });
}

基軸通貨の条件

  • 必ず有効: is_base_currency = TRUEの場合、is_activeも必ずTRUE
  • 削除不可: 基軸通貨は無効化できない(UI側で制御)

通貨記号の自動生成

通貨コードから通貨記号を自動生成する実装を推奨:

// 通貨記号の自動生成例
public function getCurrencySymbolAttribute(): string
{
    return match ($this->currency_code) {
        'JPY' => '¥',
        'USD' => '$',
        'EUR' => '€',
        'GBP' => '£',
        'CNY' => '¥',
        'AUD' => 'A$',
        'CAD' => 'C$',
        'CHF' => 'Fr',
        default => $this->currency_code,
    };
}

有効化ポリシー

  • is_active: 有効/無効フラグ
  • 無効化: 使用されていない通貨を無効化(論理削除ではない)
  • 再有効化: 無効化された通貨を再度有効化可能

将来の拡張

為替レート機能(Phase 2)

将来的に為替レート変換機能を追加する場合:

  • exchange_ratesテーブルを追加
  • 基軸通貨からの換算レートを保持
  • 外部API(例: Open Exchange Rates API)からレート取得

複数通貨価格(Phase 3)

通貨ごとに異なる価格を設定する場合:

  • product_var_pricesテーブルを追加
  • SKUごと・通貨ごとの価格を保持

クエリ例

-- 基軸通貨を取得
SELECT * FROM currencies
WHERE is_base_currency = TRUE
LIMIT 1;

-- 有効な通貨一覧を取得
SELECT currency_code, currency_name, currency_symbol
FROM currencies
WHERE is_active = TRUE
ORDER BY sort_order;

-- 通貨コードから通貨情報を取得
SELECT * FROM currencies
WHERE currency_code = 'JPY';

Eloquentモデル例

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Currency extends Model
{
    protected $fillable = [
        'currency_code',
        'currency_name',
        'currency_symbol',
        'is_base_currency',
        'is_active',
        'sort_order',
    ];

    protected function casts(): array
    {
        return [
            'is_base_currency' => 'boolean',
            'is_active' => 'boolean',
        ];
    }

    // 基軸通貨を取得
    public static function getBaseCurrency(): ?self
    {
        return self::where('is_base_currency', true)->first();
    }

    // 有効な通貨一覧を取得
    public static function getActiveCurrencies(): Collection
    {
        return self::where('is_active', true)
            ->orderBy('sort_order')
            ->get();
    }
}