paginar con join

edited marzo 2012 in Principiantes
Hola gente de kumbiaphp.
Estoy empezando a utilizar vuestro framework y me encontré con el siguiente problema:

Estoy intentando realizar una tabla con los datos de una tabla incluyendo datos de las tablas relacionadas.
Para ello estoy usando el paginate_by_sql realizando INNER JOIN.

El código es el siguiente:

class Empresa extends ActiveRecord
{
    public function getEmpresasConGrupos($page, $ppage=20){
        $sql = "SELECT * FROM empresa INNER JOIN grupo_empresa ON empresa.grupo_empresas_id = grupo_empresa.id)";
        return $this->paginate_by_sql($sql, "page: $page", "perpage: $ppage");
    }
}

El problema es que me da el siguiente error:


KumbiaException: Every derived table must have its own alias al
ejecutar <em>"SELECT COUNT(*) FROM (SELECT empresa.nombre FROM
empresa INNER JOIN grupo_empresa ON empresa.grupo_empresas_id =
grupo_empresa.id)) AS t"</em> (0)

En el archivo /var/www/sumo/core/libs/db/adapters/mysql.php en la línea: 158

Me imagino que debe ser algo básico que no estoy haciendo bien.

Estoy usando la versión 1.0 beta 2.

A propósito, no hay otra forma de hacer un paginate compuesto sin utilizar el paginate_by_sql asi mantenemos la independencia del motor de base de datos.

Desde ya agradezco cualquier ayuda.

Saludos.

Tagged:

Comentarios

  • edited marzo 2012
    Buenas Tico, viendo tu sql:

    $sql = "SELECT * FROM empresa INNER JOIN grupo_empresa ON empresa.grupo_empresas_id = grupo_empresa.id)";

    veo que tienes un cierre de parentesis al final que está de más, ese debe ser el probema.

    Respondiendo a tu segunda pregunta, si hay otra forma de realizar un paginate y para tu caso seria más o menos asi:

    $modelo->paginate("columns: empresa.*,grupo_empresa.campo1,grupo_empresa.campo1 " , "join: inner join grupo_empresa ON empresa.grupo_empresas_id = grupo_empresa.id","page: $page" , "per_page: $ppage");

    El metodo paginate recibe los mismos parametros que el metodo find: group, order, join, columns, ademas del los parametros page y per_page.

    aqui tienes mas ejemplos de uso:

    https://github.com/manuelj555/backend_kumbia/blob/bootstrap_2/app/models/usuarios.php

    https://github.com/manuelj555/backend_kumbia/blob/bootstrap_2/app/models/menus.php
  • muchas gracias manuel_j555 por tu respuesta.

    Entre las pistas que me diste y el código de tus clases lo logré sacar.

    Te muestro como lo resolví:

    en el modelo quedó así:

        public function getEmpresasConGrupos($page, $ppage=20){
            $cols = "empresa.*,(grupo_empresa.nombre) grupo";
            $join = "INNER JOIN grupo_empresa ON grupo_empresa.id = empresa.grupo_empresas_id";
            return $this->paginate("columns: $cols","join: $join","page: $page","per_page: $ppage");
        }


    y en la vista:

            <?php foreach ($listEmpresas->items as $item): ?>
            <tr>
                <td><?php echo $item->id; ?></td>
                <td><?php echo $item->nombre; ?></td>
                <td><?php echo $item->grupo; ?></td>
                <td><?php echo Ajax::link("empresa/edit/$item->id/", 'Editar', 'principal') ?></td>
                <td><?php echo Ajax::linkConfirm("empresa/delete/$item->id/", 'Borrar', 'principal','¿Está seguro de borrar este registro?') ?></td>
            </tr>
            <?php endforeach;?>

    Espero que a algún otro kumbiero novato como yo lo pueda sacar de apuros.

    Mil Gracias!!!

    P.D.: muy bueno el trabajo para el backend que hiciste. Está muy interesante.
  • que bueno que te funcionará, y Gracias :-)
  • edited julio 2012
    Gracias tito2k,  a mi como principiante me ha servido, gracias :-)

    en la beta2 también existe esta opción: 

    $query="SELECT alertas.fecha_at, 
                    plantas.direccion, 
                    usuarios.rut, 
                    turnos.nombre, 
                    alertas.parametro, 
                    alertas.valor
    FROM alertas 
    JOIN plantas ON (plantas.id = alertas.plantas_id) 
    JOIN usuarios ON (usuarios.id = alertas.usuarios_id) 
    JOIN turnos ON (turnos.id = alertas.turnos_id)";
    return $this->paginate_by_sql($query, "page: $page", "per_page: $ppage");   
  • Hay una forma de obtener todos los registros pagiandos?

    per_pag: all

     

  • No tiene sentido hacer un paginado donde tengas todos los registros
Sign In or Register to comment.