Задать вопрос

Как в Doctrine для embedded-поля задать имя поля в таблице БД?

Всех с новым годом! :)

Имеется сущность 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» в их именовании. Но как мне это объяснить Доктрине? Такое вообще возможно?
  • Вопрос задан
  • 998 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
Decadal
@Decadal
не. Переопределение имён для Embedded не поддерживается
https://stackoverflow.com/questions/53497770/doctr...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы