Предпосылки:
- PHP 7.1.8
- Symfony 3.3.9
- Doctrine 2.6.x-dev
Интересно, возможно ли переопределить атрибут inversedBy
сопоставления ассоциаций свойств, взятый из признака.
Интерфейс, который я использую в качестве заполнителя конкретного пользователя:
ReusableBundle\ModelEntrantInterface.php
interface EntrantInterface
{
public function getEmail();
public function getFirstName();
public function getLastName();
}
- Следующая архитектура работает очень хорошо (нужно создать объект
User
, который реализуетEntrantInterface
и все другие объекты, которые получены из этих абстрактных классов вAppBundle
):
ReusableBundle\Entity\Entry.php
/**
* @ORM\MappedSuperclass
*/
abstract class Entry
{
/**
* @var EntrantInterface
*
* @ORM\ManyToOne(targetEntity="ReusableBundle\Model\EntrantInterface", inversedBy="entries")
* @ORM\JoinColumn(name="user_id")
*/
protected $user;
// getters/setters...
}
ReusableBundle\Entity\Timestamp.php
/**
* @ORM\MappedSuperclass
*/
abstract class Timestamp
{
/**
* @var EntrantInterface
*
* @ORM\ManyToOne(targetEntity="ReusableBundle\Model\EntrantInterface", inversedBy="timestamps")
* @ORM\JoinColumn(name="user_id")
*/
protected $user;
// getters/setters...
}
И еще пару объектов с аналогичной структурой, которые используют EntranInterface
- И это то, чего я хочу достичь -
UserAwareTrait
для повторного использования для нескольких объектов:
ReusableBundle\Entity\Черты характера \UserAwareTrait.php
trait UserAwareTrait
{
/**
* @var EntrantInterface
*
* @ORM\ManyToOne(targetEntity="ReusableBundle\Model\EntrantInterface")
* @ORM\JoinColumn(name="user_id")
*/
protected $user;
// getter/setter...
}
В Doctrine 2.6, если бы я использовал суперкласс и хотел переопределить его свойство, я бы сделал это:
/**
* @ORM\MappedSuperclass
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride({name="property", inversedBy="entities"})
* })
*/
abstract class Entity extends SuperEntity
{
// code...
}
Но если я хочу, чтобы Entity использовал UserAwareTrait
и переопределил ассоциативное сопоставление свойства...
/**
* @ORM\MappedSuperclass
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride({name="user", inversedBy="entries"})
* })
*/
abstract class Entry
{
use UserAwareTrait;
// code...
}
... и запустите php bin/console doctrine:schema:validate
Я вижу эту ошибку в консоли:
[Учение\ORM\Mapping\MappingException]
Недопустимое переопределение поля с именем 'user' для класса 'ReusableBundle\Entity\Entry'.
Есть ли способ обхода, который я мог бы выполнить для достижения желаемого результата?
-
Использовать свойство для хранения общих свойств
-
Отменить сопоставление ассоциаций или (возможно) сопоставление атрибутов в классе, который использует этот признак