Предпосылки:
- PHP 7.1.8
- Симфония 3.3.9
- Доктрина 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\Traits\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...
}
Но если я хочу, чтобы этот объект использовал UserAwareTrait
и переопределял сопоставление ассоциации свойства...
/**
* @ORM\MappedSuperclass
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride({name="user", inversedBy="entries"})
* })
*/
abstract class Entry
{
use UserAwareTrait;
// code...
}
... и запустить php bin/console doctrine:schema:validate
я вижу эту ошибку в консоли:
[Doctrine\ORM\Mapping\MappingException]
Недопустимое переопределение поля с именем "user" для класса "ReusableBundle\Entity\Entry".
Есть ли обходной путь, которому я мог бы следовать для достижения желаемого результата?
Используйте трейт для хранения общих свойств
Переопределить сопоставление ассоциации или (возможно) сопоставление атрибутов в классе, который использует этот признак
MappedSuperclass
. Вы пробовали это, удалив строку@ORM\MappedSuperclass
надabstract class Entry
? И что еще более важно: вы пытаетесь переопределить отношение без его указания (в данном случаеManyToOne
. Попробуйте:@ORM\AssociationOverrides({ @ORM\AssociationOverride(name="user", manyToMany=@ORM\ManyToOne(targetEntity="ReusableBundle\Model\EntrantInterface", inversedBy="entities")) })
. - person goulashsoup   schedule 26.09.2017inversedBy="entries"
, который совпадает с оригиналом, а во втором последнем блоке этоinversedBy="entities"
... - person goulashsoup   schedule 26.09.2017