Search code examples
phpdoctrine-ormpaginationdoctrinenativequery

Doctrine Paginator with NativeQuery


I'm trying to use Doctrine Paginator, but I'm HAVING TO use NativeQuery since I use a custom DB function in my Query.

But I get this error:

Fatal error: Uncaught Error: Call to undefined method Doctrine\ORM\NativeQuery::getFirstResult()

My code so far is:

$sql = "SELECT std_modulos_aulas.idaula, std_modulos_aulas.idmodulo, conteudo, std_modulos_aulas.titulo
            FROM  uov.std_modulos_aulas
            INNER JOIN uov.std_modulos ON std_modulos_aulas.idmodulo = std_modulos.idmodulo
            INNER JOIN uov.std_cursos ON std_cursos.idcurso = std_modulos.idcurso
            WHERE std_modulos.publicar = 's' AND std_modulos.excluido = 'n' AND std_modulos_aulas.publicar = 's' AND std_cursos.idcurso = ".$curso." AND academico.strip_tags(LOWER(std_modulos_aulas.conteudo)) LIKE '".$termo."'
            ORDER BY std_modulos.ordem ASC, std_modulos_aulas ASC";

$rsm = new ResultSetMapping;

$rsm->addScalarResult('idaula', 'idaula');
$rsm->addScalarResult('idmodulo', 'idmodulo');
$rsm->addScalarResult('conteudo', 'conteudo');
$rsm->addScalarResult('titulo', 'titulo');

$query = $this->em->createNativeQuery($sql, $rsm);

return new Paginator($query, $fetchJoinCollection = false);

Any help would be nice. I've already tried using QueryBuilder, but my strip_tags function isn't working in that way. The old topics couldn't help me.


Solution

  • For those who might have the same problem in the future:

    I ended up solving this by:

    At my Model, I returned a standard query result:

    $sql = "SELECT std_modulos_aulas.idaula, std_modulos_aulas.idmodulo, conteudo, std_modulos_aulas.titulo
            FROM  uov.std_modulos_aulas
            INNER JOIN uov.std_modulos ON std_modulos_aulas.idmodulo = std_modulos.idmodulo
            INNER JOIN uov.std_cursos ON std_cursos.idcurso = std_modulos.idcurso
            WHERE std_modulos.publicar = 's' AND std_modulos.excluido = 'n' AND std_modulos_aulas.publicar = 's' AND std_cursos.idcurso = ".$curso." AND academico.strip_tags(LOWER(std_modulos_aulas.conteudo)) LIKE '".$termo."'
            ORDER BY std_modulos.ordem ASC, std_modulos_aulas ASC";
    
    $rsm = new ResultSetMapping;
    
    $rsm->addScalarResult('idaula', 'idaula');
    $rsm->addScalarResult('idmodulo', 'idmodulo');
    $rsm->addScalarResult('conteudo', 'conteudo');
    $rsm->addScalarResult('titulo', 'titulo');
    
    $query = $this->em->createNativeQuery($sql, $rsm);
    return $query->execute();
    

    And then, at my Controller, I used a Zend Paginator:

    $iteratorAdapter = new \Zend\Paginator\Adapter\ArrayAdapter($result);
    $paginator = new \Zend\Paginator\Paginator($iteratorAdapter);
    $paginator->setCurrentPageNumber($page);
    $paginator->setItemCountPerPage(10);