1

アカウントと呼ばれる関連エンティティのプロパティに基づいて、「クライアント」エンティティのリストをフィルタリングしようとしています。問題は、Account エンティティは単なる基本クラスであり、フィルタリングの実際のプロパティは子エンティティ (PersonalAccount および EnterpriseAccount) に存在しますが、doctrine では Account 基本クラスのプロパティにしかアクセスできないことです。

要約すると、ここに私の状況があります:

クライアント エンティティ:

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

ベース Account エンティティ:

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

PersonalAccount エンティティ (アカウントの子)

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 クラスのプロパティを使用して Client エンティティをフィルター処理するにはどうすればよいですか?

4

2 に答える 2

3

まず、親クラスにいくつかの継承アノテーションを追加する必要があります。Doctrine doc からこの記事を読む必要があります: 6. Inheritance Mapping

実際、継承は降順ではなく昇順です。

「スーパークラスにアクセスして特定の子に存在するプロパティをチェックすることは、厳密な 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 に答える