EntitySubClass1
, EntitySubClass2
и EntitySubClass3
все расширяются MappedSuperclassBase
.
MappedSuperclassBase
/** @MappedSuperclass */
class MappedSuperclassBase
{
/** @Column(type="integer") */
protected $mapped1;
/** @Column(type="string") */
protected $mapped2;
/**
* @OneToOne(targetEntity="MappedSuperclassRelated1")
* @JoinColumn(name="related1_id", referencedColumnName="id")
*/
protected $mappedRelated1;
// ... more fields and methods
}
EntitySubClass1
/** @Entity */
class EntitySubClass1 extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
EntitySubClass2
/** @Entity */
class EntitySubClass2 extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
EntitySubClass3
/** @Entity */
class EntitySubClass3 extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
SomeOtherClass
содержит один экземпляр одного из трех объектов, расширяющих MappedSuperclassBase
.Кроме того, один экземпляр этих трех объектов должен принадлежать одному и только одному (т. Е. Не нулю) экземпляру SomeOtherClass
.
Чтобы реализовать это с помощью Doctrine, я подумал сделатьследующее:
/** @Entity */
class SomeOtherObject
{
// ...
/**
* One SomeOtherObject has One MappedSuperclassBase.
* @OneToOne(targetEntity="MappedSuperclassBase", mappedBy="someOtherObject")
*/
private $mappedSuperclassBase;
// ...
}
/** @MappedSuperclass */
class MappedSuperclassBase
{
// ...
/**
* One MappedSuperclassBase has One SomeOtherObject.
* @OneToOne(targetEntity="SomeOtherObject", inversedBy="mappedSuperclassBase")
* @JoinColumn(name="someOtherObject_id", referencedColumnName="id")
*/
private $someOtherObject;
// ...
}
Сопоставление допустимо, и я могу сгенерировать схему, но при создании объекта SomeOtherClass
я получаю MappedSuperclassBase table does not exist
.
.читая документацию Я вижу, что сопоставленный суперкласс должен быть однонаправленным (только с владельцем)
Сопоставленный суперкласс не может быть сущностью, этоне поддерживаемые запросом и постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленными (только со стороны владельца).Это означает, что связи «один ко многим» вообще не возможны для сопоставленного суперкласса.Более того, ассоциации «многие ко многим» возможны только в том случае, если сопоставленный суперкласс используется только в одном объекте в данный момент.Для дальнейшей поддержки наследования необходимо использовать функции наследования одиночной или объединенной таблицы.
Хорошо, я вижу, что моя попытка не соответствует документации.При этом, как я должен реализовать вышеуказанные требования?Можно ли использовать сопоставленный суперкласс или мне нужно будет использовать CTI с Abstractclassbase
, который не содержит ничего, кроме SomeOtherClass
'id
, и будет наказан дополнительным объединением?