我在研究所和研究所课程之间有一对多的关系。
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的新手,无法弄清楚出了什么问题。
答案 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();