Symfony Doctrine一对多查询构建器

时间:2015-12-08 13:03:48

标签: php symfony doctrine-orm doctrine query-builder

我在研究所和研究所课程之间有一对多的关系。

class Institutes {
  /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\OneToMany(targetEntity="PNC\InstitutesBundle\Entity\InstitutesCourses", mappedBy="institute", cascade={"all"})
     * */
    protected $inst;
}

class InstitutesCourses {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity="PNC\InstitutesBundle\Entity\Institutes", inversedBy="inst")
     * @ORM\JoinColumn(name="institute_id", referencedColumnName="id")
     */
    protected $institute;
    /**
     * @ORM\ManyToOne(targetEntity="PNC\CoursesBundle\Entity\Courses", inversedBy="instituteCourses")
     * @ORM\JoinColumn(name="course_id", referencedColumnName="id")
     */
    protected $course;
}

我想将所有课程分配到一门课程。每个研究所都归用户所有。我写了这个运行良好的psql查询

SELECT ic.*
FROM institutes_courses ic
RIGHT JOIN institutes i ON i.id = ic.institute_id
WHERE i.user_id = 26;

 id  | institute_id | course_id |
-----+--------------+-----------+
 389 |           21 |        51 |
 390 |           21 |        53 |
 391 |           21 |        52 |

并将其翻译成doctinre querybuilder;

$repository = $em->getRepository('PNCInstitutesBundle:InstitutesCourses');

            $query= $repository->createQueryBuilder('ic')
                ->select('ic')
                ->from('PNCInstitutesBundle:InstitutesCourses', 'ic')
                ->orderBy('ic.id', 'ASC')
                 // THE FOLLOWING LINE IS CRITICAL:
                ->JOIN('PNCInstitutesBundle:Institutes', 'i', 'WITH' ,'i.id=ic.institute')
                ->where('i.user = :user')
                ->setParameter('user', $this->getUser()->getId())
                ->getQuery();

它说,

  

[语义错误]第0行,第170行靠近'ic INNER JOIN':错误:'ic'   已定义。

symfony2 doctrine的新手,无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:1)

如果您查看createQueryBuilder的源代码,您会看到以下内容:

public function createQueryBuilder($alias, $indexBy = null)
{
    return $this->_em->createQueryBuilder()
        ->select($alias)
        ->from($this->_entityName, $alias, $indexBy);
}

这意味着您不应在代码中执行以下操作。

->select('ic')
->from('PNCInstitutesBundle:InstitutesCourses', 'ic')

只需放下那些线就可以了。存储库已经为您完成了。

答案 1 :(得分:1)

试试这个:

(编辑)

$repository = $em->getRepository('PNCInstitutesBundle:InstitutesCourses');

$query= $repository->createQueryBuilder('ic')
     ->leftJoin('ic.institute', 'i')
     ->where('i.user = :user')
     ->setParameter('user', $this->getUser()->getId())
     ->orderBy('ic.id', 'ASC')
     ->getQuery();

$results = $query->getResult();