1

我正在尝试根据名为 Account 的关联实体的属性过滤“客户”实体列表。问题是 Account 实体它只是一个基类,用于过滤的实际属性存在于它们的子实体(PersonalAccount 和 EnterpriseAccount)中,但原则只允许我访问 Account 基类的属性。

总结一下,这是我的情况:

客户实体:

class Client 
{
    /** @ORM\OneToMany(targetEntity="Account", mappedBy="client") */
    protected $accounts;
}

基本帐户实体:

class Account 
{
    /** @ORM\ManyToOne(targetEntity="Client", inversedBy="accounts") */
    protected $client;
}

PersonalAccount 实体(Account 的子实体)

class PersonalAccount extends Account
{
    /** @ORM\Column() */
    protected $name;
}

在我的控制器中,我尝试了:

$qb = $em->getRepository('MyBundle:Client')->createQueryBuilder('cl');

$query = $qb->select('cl')
            ->innerJoin('cl.accounts', 'acc')
            ->where('acc.name = :name')
            ->setParameter('name', 'Jhon')
            ->getQuery();

但它会引发异常,因为基类 Account 没有名为“name”的属性。

如何使用继承的 PersonalAccount 类的属性过滤客户端实体?

4

2 回答 2

3

首先,您应该在父类中添加一些继承注释。您应该阅读 Doctrine 文档中的这篇文章:6. 继承映射

事实上,继承是升序的,而不是降序的。

“如果没有预先特定的类型转换,任何严格的 OO 语言中都无法访问超类并检查某个子对象上存在的属性。”

您需要的功能正在这里讨论。

但是:您目前可以做的是使用类表继承和类似的东西:

$qb = $em->getRepository('MyBundle:Client')->createQueryBuilder('cl');
$qb2 = $em->getRepository('MyBundle:PersonalAccount')->createQueryBuilder('persoAcc');

$query = $qb->select('cl')
            ->where(
                $qb->expr()->in(
                    'cl.id',
                    $qb2->select('persoAcc.id')
                        ->where('persoAcc.name = :name')
                        ->setParameter('name', 'Jhon')
                        ->getDql()
                )
            )
            ->getQuery();

我建议您使用存储库类。

于 2012-05-12T11:49:31.117 回答
1

在客户端上添加关联:

/** @ORM\OneToMany(targetEntity="PersonalAccount", mappedBy="client") */
protected $personalAccounts;

并加入它:

->innerJoin('cl.personalAccounts', 'acc')
于 2012-05-12T09:45:22.793 回答