Symfony2 和 Doctrine:Many-to-many 关系使用查询生成器
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;
这个小问题的原因很简单:在User中,$archives代表一个用户提交的所有存档,$collection代表一个用户使用的所有存档(甚至是其他用户提交的) . Archive实体中,$user代表提交该存档的用户,$users代表所有使用该存档的用户。
所以,要获取一个用户的档案,我只是用它来做:
$this->getUser()->getArchives();
并获得 collection:
$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();
但这里的问题是我不使用 collection table 直接进入存档(没有实体)。谁能解释一下我为什么要考虑 collection table 来过滤我的结果?
非常感谢
曼纽尔
已解决
感谢 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 应该可以解决问题
我有 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;
这个小问题的原因很简单:在User中,$archives代表一个用户提交的所有存档,$collection代表一个用户使用的所有存档(甚至是其他用户提交的) . Archive实体中,$user代表提交该存档的用户,$users代表所有使用该存档的用户。
所以,要获取一个用户的档案,我只是用它来做:
$this->getUser()->getArchives();
并获得 collection:
$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();
但这里的问题是我不使用 collection table 直接进入存档(没有实体)。谁能解释一下我为什么要考虑 collection table 来过滤我的结果?
非常感谢 曼纽尔
已解决
感谢 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 应该可以解决问题