学说加入条件

时间:2015-11-26 17:06:58

标签: symfony doctrine-orm

我有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实体的相同实例。这就是我没有所需数据的原因。

2 个答案:

答案 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();