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();
}
}