3

我现在在网上搜索了几个小时,但找不到以下(减少的)问题的解决方案:

我的 Symfony2 项目中有两个实体:

/**
 * @ORM\Entity(repositoryClass="myBundle\Entity\AppuserRepository")
 * @ORM\Table(name="appuser")
 */
class Appuser implements UserInterface {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id = "";

    /**
     * @ORM\OneToMany(targetEntity="Watched", mappedBy="appuserReference")
     */
    protected $watches;

    // ________________________________________________________________________

    public function __construct() {
        $this->watches = new \Doctrine\Common\Collections\ArrayCollection();
    }

}
/**
 * @ORM\Entity
 * @ORM\Table(name="watched")
 */
class Watched extends WatchedAbstract {
    /**
     * @ORM\ManyToOne(targetEntity="Appuser", inversedBy="watches")
     * @ORM\JoinColumn(name="appuserReference_id", referencedColumnName="id")
     */
    protected $appuserReference;
}

如何使用 queryBuilder oder createQuery 来获取所有用户,这些用户由几个 Watched-Entities 引用(即 ID 为 1、3 和 12 的用户;-))?

这是在 MySql 中运行的 SQL,我无法将其“翻译”为 DQL:

SELECT * FROM appuser WHERE id IN (
    SELECT w.appuserReference_id 
        FROM watched w WHERE w.id IN (1, 3, 12));

我只是设法加入另一个方向,因为 Appuser-Entity 没有“手表”的相关列。我不能使用“appuserReference_id”或“appuserReference”来进行内部选择。

希望你能理解我,谢谢!

4

2 回答 2

3

由于您的实体是相关的,因此您应该使用JOIN而不是多个SELECTs:

$repository = $this->getDoctrine()->getRepository('jwatchBundle:Appuser');

$query = $repository->createQueryBuilder('u')
                    ->join('u.watches', 'w')
                    ->where('w.id IN :watched_ids')
                    ->setParameter('watched_ids', array(1, 3, 12))
                    ->getQuery();

$result = $query->getResult();   
于 2013-03-19T13:47:04.530 回答
0

据我所知,Sub-SELECT在 Doctrine 中是不可能的。

但是,当我理解您纠正这样的事情时,可以完成这项工作:

$query = $this->createQueryBuilder('a')
    ->where('a.watches in (1, 3, 12)')
    ->getQuery();

如果我错过了你的目标,请告诉我。

于 2013-03-19T13:44:56.577 回答