Всех с новым годом! :)
Имеется сущность Client, которая содержит разные сведения о клиенте. У меня вызывает вопрос как с помощью Doctrine в БД назначить имена полям «фамилия», «имя» и «отчество» при том подходе, который используется у меня.
В сущности Client есть поле name, оно представлено value object-ом с именем FullName. Для связи с этим объектом в доктрине используется embedded-связь, прописанная в аннотациях.
FullName в свою очередь содержит три поля: фамилия, имя и отчество. При этом, каждое поле представлено собственным value object-ом, который называется просто Name. Зачем? Name умеет сокращать имя, для этого и был выделен в отдельный value object. Допустим, «Иван» сократит до «И.». Далее уже в FullName можно легко сделать метод, возвращающий сокращенное имя пользователя «Иванов И. И.».
Чтобы было понятно о чем идет речь, у меня примерно вот такой код:
/** @ORM\Entity() */
class Client
{
/** @ORM\Id() */
private int $id;
/** @ORM\Embedded(class="FullName") */
private FullName $name;
public function __construct(FullName $name)
{
$this->name = $name;
}
}
/** @ORM\Embeddable() */
class FullName
{
/** @ORM\Embedded(class="Name") */
private Name $surname;
/** @ORM\Embedded(class="Name") */
private Name $name;
/** @ORM\Embedded(class="Name") */
private Name $patronymic;
public function __construct(Name $surname, Name $name, Name $patronymic)
{
$this->surname = $surname;
$this->name = $name;
$this->patronymic = $patronymic;
}
public function getFullName()
{
return implode(' ', [
$this->surname->getFull(),
$this->name->getFull(),
$this->patronymic->getFull(),
]);
}
public function getShortName()
{
return implode(' ', [
$this->surname->getFull(),
$this->name->getShort(),
$this->patronymic->getShort(),
]);
}
}
/** @ORM\Embeddable() */
class Name
{
/** @ORM\Column(type="string", length=100) */
private string $value;
public function __construct(string $value)
{
$this->value = $value;
}
public function getFull(): string
{
return $this->value;
}
public function getShort(): string
{
$value = $this->value;
if ($value) {
$value = mb_substr($value, 0, 1) . '.';
}
return $value;
}
}
Так как фамилия, имя и отчество хранятся в своих объектах класса Name в поле с одинаковым именем value, то приходится полагаться на автоматически добавленный columnPrefix, например «surname_», поэтому в таблице БД получаются поля «surname_value», «name_value», «patroymic_value». Такое именование мне не нравится чисто эстетически. Хотелось бы избавиться от суффикса «_value» в их именовании. Но как мне это объяснить Доктрине? Такое вообще возможно?