Php 在函数addSelect()中如何正确使用sql JOIN和ON语句
上面的查询可以工作,但是如果我删除Php 在函数addSelect()中如何正确使用sql JOIN和ON语句,php,sql,symfony,doctrine,dql,Php,Sql,Symfony,Doctrine,Dql,上面的查询可以工作,但是如果我删除$dql->addSelect(…函数)上的注释,它会抛出以下错误错误:预期的条令\ORM\Query\Lexer::T\u CLOSE\u括号,got'on'(500内部服务器错误)。我需要知道我做错了什么,以及可能的工作方式。谢谢。SQL查询需要一个select子句。为什么要删除对addSelect()?@TimBiegeleisen select的调用?查询中已经有了它。只需使用addSelect()要在单个查询中获取额外数据,在条令中没有ON,因为条令知
$dql->addSelect(…
函数)上的注释,它会抛出以下错误错误:预期的条令\ORM\Query\Lexer::T\u CLOSE\u括号,got'on'(500内部服务器错误)
。我需要知道我做错了什么,以及可能的工作方式。谢谢。SQL查询需要一个select子句。为什么要删除对addSelect()
?@TimBiegeleisen select的调用?查询中已经有了它。只需使用addSelect()要在单个查询中获取额外数据,在条令中没有ON,因为条令知道如何连接表。尝试使用@FrankB Thank。不久前我发现我只需要删除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()];
}