Symfony2和Doctrine:使用查询生成器的多对多关系


Symfony2 and Doctrine: Many-to-many relation using query builder

我有两个实体:User和Archive。用户实体有两个属性:

/**
 * @ORM'OneToMany(targetEntity="My'ApplicationBundle'Entity'Archive", mappedBy="user")
 **/
protected $archives;
/**
 * @ORM'ManyToMany(targetEntity="My'ApplicationBundle'Entity'Archive", inversedBy="users")
 * @ORM'JoinTable(name="collection")
 **/
private $collection;

以及档案实体:

/**
 * @ORM'ManyToOne(targetEntity="My'UserBundle'Entity'User", inversedBy="archives")
 * @ORM'JoinColumn(name="user_id", referencedColumnName="id")
 **/
protected $user;
/**
 * @ORM'ManyToMany(targetEntity="My'UserBundle'Entity'User", mappedBy="collection")
 **/
private $users;

造成这个小混乱的原因很简单:在User中,$archives代表用户提交的所有归档,$collection代表用户使用的所有归档(甚至是其他用户提交的归档)。在Archive实体中,$user表示提交此归档的用户,$users表示使用此归档的所有用户。

所以,要获得一个用户的档案,我只需要做一件事:

$this->getUser()->getArchives();

并获取集合:

$this->getUser()->getCollection();

现在的问题是我必须对结果进行分页,所以我需要使用查询生成器。我正在做的是:

$repository = $this->getDoctrine()
        ->getRepository('MyApplicationBundle:Archive');
    $query = $repository->createQueryBuilder('a')
        ->innerJoin('a.user', 'u', 'WITH', 'u = :user')
        ->where('a.active = :active')
        ->setParameters(array(
            'user' => $this->getUser(),
            'active' => 1
        ))
        ->setFirstResult($start)
        ->setMaxResults($length)
        ->getQuery()
        ->getResult();

但这里的问题是,我将直接转到Archive,而不使用集合表(没有实体)。有人能解释一下我热到考虑收集表来过滤我的结果吗?

非常感谢Manuel


已解决

多亏了LPodolski,这就是我更改DQB 的方式

$query = $repository->createQueryBuilder('a')
        //->innerJoin('a.user', 'u', 'WITH', 'u = :user')
        ->innerJoin('a.users', 'cu', 'WITH', 'cu = :user')
        ->where('a.active = :active')
        ->setParameters(array(
            'user' => $this->getUser(),
            'active' => 1
        ))
        ->setFirstResult($start)
        ->setMaxResults($length)
        ->getQuery()
;
>innerJoin('a.users', 'cu', 'WITH', 'cu = :collectionUser')

或者leftJoin应该完成