私は元々、この質問に対するこの回答をstackoverflowで書きましたが、この質問にも同じ答えが当てはまると思います。
Mathias Verraesによるあなたの問題についての記事がここにあります。彼は、UIに役立つ概念からモデル内の値オブジェクトを分離することについて話しています。
国をエンティティまたは値オブジェクトとしてモデル化するかどうかを尋ねられたときの記事からの引用:
国をエンティティとしてモデリングし、それらをデータベースに保存しても本質的に問題はありません。しかし、ほとんどの場合、それは複雑すぎます。国はあまり変わりません。国の名前が変わると、実際には、すべての実用的な目的のために、新しい国になります。ある国がもう存在しない場合、その国は2つの国に分割されている可能性があるため、単にすべての住所を変更することはできません。
彼は、次のような新しい概念を導入するための別のアプローチを提案しましたAvailableCountry。
これらの利用可能な国は、データベース内のエンティティ、JSON内のレコード、または単にコード内のハードコーディングされたリストです。(これは、ビジネスがUIを介して簡単にアクセスしたいかどうかによって異なります。)
<?php
final class Country
{
private $countryCode;
public function __construct($countryCode)
{
$this->countryCode = $countryCode;
}
public function __toString()
{
return $this->countryCode;
}
}
final class AvailableCountry
{
private $country;
private $name;
public function __construct(Country $country, $name)
{
$this->country = $country;
$this->name = $name;
}
/** @return Country */
public function getCountry()
{
return $this->country;
}
public function getName()
{
return $this->name;
}
}
final class AvailableCountryRepository
{
/** @return AvailableCountry[] */
public function findAll()
{
return [
'BE' => new AvailableCountry(new Country('BE'), 'Belgium'),
'FR' => new AvailableCountry(new Country('FR'), 'France'),
//...
];
}
/** @return AvailableCountry */
public function findByCountry(Country $country)
{
return $this->findAll()[(string) $country];
}
}
したがって、ルックアップテーブルを値オブジェクトとエンティティの両方としてモデル化する3番目の解決策があるようです。
ところで、この記事に関するいくつかの深刻な議論については、コメントセクションを確認してください。