我有3个表:考试,字段和数据。
关系是:
考试manyToMany字段; field oneToMany数据;检查oneToMany数据
我需要指定field_id和exam_id来获取所需的数据 在SQL中我这样做:
SELECT * FROM exam
LEFT JOIN field ON exam.id = field.exam_id
LEFT JOIN data ON field.id = data.field_id AND (data.exam = exam.id)
有效
在学说中:
$this->_em->getRepository('FwFollowBundle:Exam')
->createQueryBuilder('exam')
->leftJoin('exam.field', 'field')
->leftJoin('field.data', 'data', 'WITH', 'data.exam = exam')
->select ('exam', 'field', 'data')
结果未被' WITH'过滤。条件。
我想用他们的字段返回所有考试,如果有的话,我想返回他们的数据
我有人知道为什么。 THX
编辑1: 我做了一些转储试图找到问题。 在我的项目中,我在考试和现场之间迈出了一步。 我这样做
$this->_em->getRepository('FwFollowBundle:Exam')
->createQueryBuilder('exam')
->leftJoin('exam.score', 'score')
->leftJoin('score.fields', 'field')
->leftJoin('field.data', 'data', 'WITH', 'data.exam = exam')
->select ('exam', 'score', 'field', 'data')
对于2次考试,我有相同的分数,所以相同的字段。我只与数据有差异。 它是2个考试的Field实体的相同实例。这就是我没有所需数据的原因。
答案 0 :(得分:2)
试试这样:
return $this->_em->getRepository('FwFollowBundle:Exam')
->createQueryBuilder('exam')
->leftJoin('exam.field', 'field')
->leftJoin('field.data', 'data')
->where('data.exam = :exam')
->setParameter('exam', 'exam.id')
->getQuery()
->getResult()
;
答案 1 :(得分:0)
你需要选择你想要补充的实体,否则当你打电话给$ exam-> getField() - > getData()时,doctrine会延迟加载没有标准的所有内容。
我会重写你的查询:
$exam = $this->_em->createQueryBuilder()
->select('exam', 'field', 'data')
->from('FwFollowBundle:Exam', 'exam')
->leftJoin('exam.field', 'field')
->leftJoin('field.data', 'data', 'WITH', 'data.exam = exam')
->getQuery()
->getResult();