Хорошо, это немного долго, но я думаю, что оно охватывает все ваши базы, если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.
Это сопровождается предупреждением, которое я не знаю, можете ли вы сделать Many-To-One
на MappedSuperclass. Если это невозможно, вы можете вместо этого использовать наследование таблиц классов. Попробуйте и скажите нам, работает ли он.
Имейте в виду, я довольно быстро выдвинул этот код, он не проверен, поэтому он может быть неверным, но, надеюсь, вы поймете, как он работает.
Вот и мы!
Интерфейс, позволяющий легче сказать "что такое адрес", не создавая абстрактные классы, не переопределяя методы и не вызывая чувства "плохого дизайна";)
interface Address {
function getCivicNo();
function getRoad();
function getState();
function getCountry();
}
Абстрактная сущность, которая вам на самом деле не нужна, но если вы ею не пользуетесь, вам необходимо продублировать идентификационный код.
/**
* @ORM\MappedSuperclass
*/
abstract class AbstractEntity {
/**
* Entity ID column.
*
* @var integer
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private $id;
public function getId() {
return $id;
}
}
BasicAddress, который вы можете хранить отдельно или связать с «ComplexAddress»
/**
* @ORM\Entity
*/
class BasicAddress extends AbstractEntity implements Address {
/** @ORM\Column() */
private $road;
public function getRoad() {
return $this->road;
}
// etc etc
}
«ComplexAddress» здесь, чтобы позволить вам повторно использовать код для делегирования вызовов на базовый адрес.
/**
* @ORM\MappedSuperclass
*/
abstract class ComplexAddress extends AbstractEntity implements Address {
/** @ORM\Many-To-One(targetEntity="BasicAddress")
private $basicAddress;
public function __construct(BasicAddress $basicAddress) {
$this->basicAddress = $basicAddress;
}
public function getRoad() {
return $this->basicAddress->getRoad();
}
// other methods for implementing "Address" just delegate to BasicAddress
}
PublicAddress
/**
* @ORM\Entity()
*/
class PersonalAddress extends ComplexAddress {
/** @ORM\Column(type="boolean") */
private $isPrimary;
public function isPrimary() {
return $isPrimary;
}
// other personal address methods here
}
BusinessAddress
/**
* @ORM\Entity()
*/
class BusinessAddress extends ComplexAddress {
/** @ORM\Column() */
private $businessName;
public function getBusinessName() {
return $this->businessName;
}
// other business address methods here
}
Редактировать: Только что заметил, что я забыл поместить каскадные параметры для удаления, хотя, возможно, вам придется обрабатывать это напрямую - при удалении BasicAddress
также удаляются другие адреса, которые его используют.