У меня следующий случай:
В пакете у меня есть сущность:
class Company
{
/**
* @var int
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @var string
* @ORM\Column(type="string", length=255, unique=true)
* @Gedmo\Slug(fields={"name"})
*/
private $slug;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent", referencedColumnName="id", onDelete="cascade")
*/
protected $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
*/
protected $children;
...
}
Теперь я хочу добавить дополнительные поля в приложение, но для этого мне нужно расширить класс:
class AppCategory extends Category
{
/**
* @var Article[]
* @ORM\OneToMany(targetEntity="Acme\ArticleBundle\Entity\Article", mappedBy="category")
*/
private $articles;
/**
* @var Media|null
* @ORM\ManyToOne(targetEntity="Acme\MediaBundle\Entity\Media")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
private $image;
...
}
и в doctrine config я сопоставил BaseClass с его целью:
doctrine:
orm:
resolve_target_entities:
Acme\CategoryBundle\Entity\Category: App\Entity\AppCategory
...
После этого я не только теряю связи, определенные в базовом классе:
- родитель
- дети
Но также когда я выбираю категорию, она все равно дает мне экземпляры категории вместо AppCategory:
$entity = $this->doctrine->getRepository(\Acme\CategoryBundle\Entity\Category::class)->findOneBy([]);
dump(get_class($entity));
// Shows Acme\CategoryBundle\Entity\Category
// Instead of App\Entity\AppCategory
До сих пор мне удавалось обходить отсутствующие отношения с помощью используя событие loadClassMetadata
для удаления значения inherited
из метаданных, и это, похоже, решает эту проблему, но я все еще получаю неправильный класс объектов Hydrated.
Что мне нужно сделать, чтобы doctrine всегда вернуть дочерний объект?