хорошо, я, вероятно, неправильно прочитал часть вашего вопроса:
да, у трех дочерних объектов есть внешний ключ к тому же полю id в родительской сущности (таблице), и он предназначен.Идея состоит в том, что субъект core является субъектом счета.Эта сущность имеет идентификатор.дочерние объекты наследуют этот идентификатор и получают больше атрибутов (в дочерней таблице), расширяя родительскую сущность.Вот что значит наследование.По сути, у вас есть основная сущность, которая имеет разные подтипы с дополнительными атрибутами.
(примечание: вы также можете сделать это вручную, добавив сопоставление ассоциации к потенциальным «дополнительным данным разнообразия контракт / клиент / поставщик»).для некоторой сущности субъекта-фактуры)
Это также означает, что вам на самом деле не нужно заботиться о коллизиях, поскольку запись родительской таблицы всегда сначала создается доктриной.Когда вы создаете новый InvoiceSubject любого подтипа, вы фактически создаете InvoiceSubject (имеет идентификатор) и расширяете его.Таким образом, сущности вашего контракта / клиента / провайдера просто не будут иметь одинаковый идентификатор (если вы не установите его вручную с помощью SQL).
старый ответ
Это очень опрометчивый ответ.Я имею в виду ... технически это вопрос вкуса.Я всегда предпочел бы, чтобы , а не , отображал наследование, если этого можно разумно избежать, и нет веских причин для этого.
Вопросы: у вас есть ровно один форма для их ввода?Есть ли у вас (уже) отдельные поля, которые принимают какие-либо из этих объектов?Предоставляют ли сущности одинаковую семантику?разве лень заставляет вас хотеть иметь дело только с одним «типом» сущности?Есть ли так много мест, которые хотят быть чрезвычайно агностичными к тому, что это за предмет, и не могут ли они быть решены с помощью четко определенного интерфейса?Когда к ним действительно относятся одинаково?
Лично, глядя на ваш вариант использования, я бы, вероятно, остановился на трех объектах и счете-фактуре с тремя полями, по одному для каждого объекта.Это просто, это быстро, колонки дискриминатора отстой (ИМХО, семантически, а не технически).
Добавить функцию в свой Счет, например
function getSubject() {
return $this->contract ?? $this->provider ?? $this->client;
}
, на чуть сложнее ... но если вам не нужны три разных сеттера (честно говоря,сомневаетесь, что вы создаете клиента и, устанавливая тему, вы забываете, что это клиент, и хотите рассматривать его как InvoiceSubject)
function setSubject(InvoiceSubject $subject) {
if($subject instanceof Client) {
$this->client = $subject;
} elseif (...) {} elseif (...) {}
//... technically you should unset the others, if it can only ever be one
}
Практически все концепции, которые вы можете использовать с помощью сопоставления наследования, могут быть решеныв коде с минимальными или нулевыми накладными расходами, но это сильно упростит множество других вещей.И большую часть времени вы, вероятно, можете использовать интерфейс в коде.
Отображение наследования ИМХО - больше проблем, чем оно того стоит.Если у вас нет действительно веских причин действительно нуждаться в этом: не делайте этого.Работать с уникально разными сущностями гораздо проще, чем иметь дело с какой-то абстрактной сущностью, где вы всегда должны проверять, какой это тип, и обращать внимание ... это действительно раздражает.С другой стороны, когда вы относитесь к трем сущностям одинаково ?Бьюсь об заклад, у каждого из них есть что-то уникальное, и в любом случае всегда есть распределительные коробки.если нет: интерфейс.
не усложняйте.