7

Doctrine2リポジトリクラスにQueryBuilderを受け取り、いくつかの追加句を追加するメソッドを作成したいと思います。そのうちの1つは内部結合です。

クエリビルダーをインスタンス化するために使用されたテーブルエイリアスを見つけるにはどうすればよいですか?これは発見可能なものですか、それともコードベース全体の規則である必要がありますか(したがって、潜在的なバグの原因)?

私のクライアントコードは次のとおりです。

public function getPasswordAction($id)
{
    $user = $this->get('security.context')->getToken()->getUser();

    $repository = $this->getDoctrine()
        ->getRepository('TenKPwLockerBundle:Password');

    $query = $repository->createQueryBuilder('p')
        ->where('id = :id')
        ->setParameter('id', $id);

    $query = $repository->userCanReadRestriction($query, $user);
    ...

私のリポジトリクラスには次のものが含まれています。

public function userCanReadRestriction(\Doctrine\ORM\QueryBuilder $builder, \TenK\UserBundle\Entity\User $user)
{
                             // where can I get 'p' from?
    return $builder->innerJoin('p.shares', 's')
        ->where('createdBy = :creator')
        ->orWhere('s.toUser = :toId')
        ->setParameters(array('creator' => $user, 'toUser' => $user));
}

実際、上記のコードで、QueryBuilderがパスワードエンティティとまったく連携していることを確認するにはどうすればよいですか?

4

3 に答える 3

-1

selectメソッドを呼び出すことで、QueryBuilder の一部を取得できますgetDqlPart('select')

詳細はこちら

次に、ここで選択部分を解析するためにドクトリンがどのように行うかを見てください。

リポジトリに関連付けられたテーブルが呼び出されているかどうか、およびそのエイリアスが何であるかを知るために、おそらく同じことを行うことができます。

于 2012-06-06T10:18:35.687 に答える