繁体   English   中英

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

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

我有2个实体:用户和存档。 用户实体除其他外具有两个属性:

/**
 * @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;

造成这种混乱的原因非常简单:在用户中,$ archives代表用户提交的所有档案,$ collection代表用户使用的所有档案(甚至是其他用户提交的档案)。 在“存档”实体中,$ 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();

但是这里的问题是我将不使用收集表而直接进入存档(没有实体)。 任何人都可以热烈地解释我,以考虑使用收集表来筛选我的结果吗?

非常感谢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应该可以解决问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM