/** * Get a deep application query builder * @param \Jazzee\Interfaces\Display $display * * @return \Doctrine\ORM\QueryBuilder */ protected function deepApplicantQuery(\Jazzee\Interfaces\Display $display) { $queryBuilder = $this->_em->createQueryBuilder(); $queryBuilder->from('Jazzee\\Entity\\Applicant', 'applicant'); $queryBuilder->add('select', 'applicant, attachments, decision, tags, answers, element_answers, publicStatus, privateStatus, payment, answer_greScore, answer_toeflScore, answer_school, children, answer_attachment, children_element_answers, children_publicStatus, children_privateStatus, children_payment, children_attachment, children2, children_element_answers2, children_publicStatus2, children_privateStatus2, children_payment2, children_attachment2'); $expression = $queryBuilder->expr()->orX(); //this one is the default - if there are no pages in the display then this //expression is the only one that will load and no pages will be loaded $expression->add($queryBuilder->expr()->eq("answers.page", ":nothing")); $queryBuilder->setParameter('nothing', 'nothing'); foreach ($display->getPageIds() as $key => $pageId) { $paramKey = 'displayPage' . $key; $expression->add($queryBuilder->expr()->eq("answers.page", ":{$paramKey}")); $queryBuilder->setParameter($paramKey, $pageId); } $queryBuilder->leftJoin('applicant.answers', 'answers', 'WITH', $expression); $expression = $queryBuilder->expr()->orX(); //this one is the default - if there are no elements in the display then this //expression is the only one that will load and no elements will be loaded $expression->add($queryBuilder->expr()->eq("element_answers.element", ":nothing")); $queryBuilder->setParameter('nothing', 'nothing'); foreach ($display->getElementIds() as $key => $elementId) { $paramKey = 'displayElement' . $key; $expression->add($queryBuilder->expr()->eq("element_answers.element", ":{$paramKey}")); $queryBuilder->setParameter($paramKey, $elementId); } $queryBuilder->leftJoin('answers.elements', 'element_answers', 'WITH', $expression); $queryBuilder->leftJoin('answers.publicStatus', 'publicStatus'); $queryBuilder->leftJoin('answers.privateStatus', 'privateStatus'); $queryBuilder->leftJoin('applicant.attachments', 'attachments'); $queryBuilder->leftJoin('applicant.decision', 'decision'); $queryBuilder->leftJoin('applicant.tags', 'tags'); $queryBuilder->leftJoin('answers.payment', 'payment'); $queryBuilder->leftJoin('answers.children', 'children'); $queryBuilder->leftJoin('answers.attachment', 'answer_attachment'); $queryBuilder->leftJoin('answers.greScore', 'answer_greScore'); $queryBuilder->leftJoin('answers.toeflScore', 'answer_toeflScore'); $queryBuilder->leftJoin('answers.school', 'answer_school'); $queryBuilder->leftJoin('children.elements', 'children_element_answers'); $queryBuilder->leftJoin('children.publicStatus', 'children_publicStatus'); $queryBuilder->leftJoin('children.privateStatus', 'children_privateStatus'); $queryBuilder->leftJoin('children.payment', 'children_payment'); $queryBuilder->leftJoin('children.attachment', 'children_attachment'); $queryBuilder->leftJoin('children.children', 'children2'); $queryBuilder->leftJoin('children2.elements', 'children_element_answers2'); $queryBuilder->leftJoin('children2.publicStatus', 'children_publicStatus2'); $queryBuilder->leftJoin('children2.privateStatus', 'children_privateStatus2'); $queryBuilder->leftJoin('children2.payment', 'children_payment2'); $queryBuilder->leftJoin('children2.attachment', 'children_attachment2'); $queryBuilder->where('answers.parent IS NULL'); return $queryBuilder; }