Критерии доктрины о подклассах абстрактной сущности - PullRequest
0 голосов
/ 17 мая 2018

У меня есть абстрактная сущность, которая наследуется двумя подклассами. Я использую его в сочетании с другим объектом, и теперь я хочу создать критерии для фильтрации объектов со значением свойства, равным некоторому значению.

Мой суперкласс:

/**
 * @ORM\MappedSuperclass
 * @ORM\Entity(repositoryClass="Foo\Bar\AddressRepository")
 * @ORM\InheritanceType(value="SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discriminator_type", type="string")
 * @ORM\DiscriminatorMap({"homeaddress" = "HomeAddress", "companyaddress" = "CompanyAddress"})
 */
abstract class AbstractAddress
{
    /**
     * @var bool
     * @ORM\Column(type="boolean", options={"default": 0})
     */
    protected $active;
}

Подклассы:

/**
 * @ORM\Entity(repositoryClass="Foo\Bar\AddressRepository")
 */
class HomeAddress extends AbstractAddress
{

}

/**
 * @ORM\Entity(repositoryClass="Foo\Bar\AddressRepository")
 */
class CompanyAddress extends AbstractAddress
{

}

Сущность с ассоциацией:

/**
 * @ORM\Entity(repositoryClass="Foo\Bar\CustomerRepository")
 */
class Customer
{

    /**
     * @var ArrayCollection
     * @ORM\ManyToMany(targetEntity="Foo\Bar\AbstractAddress", cascade={"all"}, orphanRemoval=true)
     */
    private $addresses;

    /**
     * @return Collection|null
     */
    public function getAddresses(): ?Collection
    {
        return $this->addresses->matching(
            Criteria::create()->where(Criteria::expr()->eq('active', true))
        );
    }
}

Эта установка выдает исключение:

ResultSetMapping Builder в настоящее время не поддерживает вашу схему наследования.

Проблема в том, что он пытается создать экземпляр AbstractAddress вместо одного из подклассов соответственно.

Есть ли способ добиться этой фильтрации с помощью Criteria API?

Я знаю, что вместо этого могу использовать filter(), но эта функция не влияет на SQL-запрос, поэтому я предпочел бы использовать этот решенный используемый критерий.

...