首页 > 解决方案 > 在教义 addSelect() 函数中如何正确使用 sql JOIN 和 ON 语句

问题描述

 public function calculateCandidatesExamScores($examIRI, $groupIRI, int $page =1)
    {
        $firstResult = ($page -1 ) * self::ITEMS_PER_PAGE;

        $dql = $this->createQueryBuilder('examlog');
        $dql->join('examlog.examQuestion', 'question');
        $dql->join('question.tblQuestionOptions', 'option');
        $dql->join('examlog.examUser', 'examRegister');
        $dql->join('examRegister.userGroup', 'group');
        $dql->join('examRegister.user', 'candidate');
        $dql->select('count(examlog.id) totalQuestions, candidate.firstname firstname, candidate.regNumber applicant_ref');
//        $dql->addSelect('(SELECT SUM(q.marks) FROM App\Core\Domain\Entity\TblExamUserLogs logs JOIN App\Core\Domain\Entity\TblQuestions q ON logs.examQuestion = q.id JOIN App\Core\Domain\Entity\TblQuestionOptions op ON q.tblQuestionOptions = op.id WHERE logs.answerText = op.answer) AS score');
        $dql->andWhere('examRegister.exam = :exam AND examRegister.userGroup = :group');
        $dql->setParameter('exam', $examIRI);
        $dql->setParameter('group', $groupIRI);
        $dql->addGroupBy('candidate.firstname, candidate.regNumber');
//        $dql->addOrderBy('score', 'DESC');
        $query = $dql->getQuery()
            ->setFirstResult($firstResult)
            ->setMaxResults(self::ITEMS_PER_PAGE);

        $doctrinePaginator = new DoctrinePaginator($query, $fetchJoinCollection = true);


        return ['totalResults'=> $doctrinePaginator->count(), 'results'=>$doctrinePaginator->getQuery()->getResult()];

    }

上面的查询有效,但如果我删除函数的注释$dql->addSelect(...,它会抛出以下错误Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got 'ON' (500 Internal Server Error)。请我需要知道做错了什么以及使其正常工作的可能方法。谢谢你。

标签: phpsqlsymfonydoctrinedql

解决方案


推荐阅读