Autor Tema: Retornar datos de una cosulta con ciclo anidado  (Leído 12339 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Retornar datos de una cosulta con ciclo anidado
« : diciembre 14, 2011, 10:28:47 am »
Hola amigos de SvCommunity, verán me surge esta necesidad, tengo una función que consulta la tabla tb_menus y esta a la vez tiene sub-menus y para ello consulta la tabla tb_submenus las consultas son sencillas si hago todo el PHP y el HTML juntos pero lo que quiero hacer es que la funcion retorne los datos en un arreglo para luego recorrerlos, este es el codigo que tengo:

Código: [Seleccionar]
    function listarPanel()
    {
        $consultaMenu = $db->query("SELECT * FROM tb_menus ORDER BY ordemenu ASC");
       
        $secciones = array();
        for($i=1; $i <= $consultaMenu->rowCount(); $i++){           
            $consultaSeccion = $->query("SELECT * FROM tb_submenus WHERE codimenu = $i ORDER BY codisecc ASC");
            while($seccion = $consultaSeccion->fetch()){
                $secciones[] = array("nombsecc" => $seccion['nombsecc']);
            }           
        }
       
        return array("panel" => array("menus" => $consultaMenu, "secciones" => $secciones));
    }   

Y Los recorro asi:

Código: [Seleccionar]
<?php foreach($panel['panel']['menus'] as $menu): ?>
<ul><?php echo $menu['nombmenu']; ?>
        <?php foreach($panel['panel']['secciones'] as $seccion): ?>
            <li><?php echo $seccion['nombsecc'?></li>
        <?php endforeach; ?>   
</ul>
<?php endforeach; ?>

Y lo unico que he logrado es que que se muestren todos los menus y todas las secciones en todos los menus, es decir no se esta respetando la condicion, espero me hayan entendido y me puedan ayudar, ya que he probado de diferentes maneras y nada.

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #1 : diciembre 14, 2011, 10:49:29 am »
La verdad no estoy 100% a la gramática de PHP pero tu error es lógico...

Código: [Seleccionar]
for($i=1; $i <= $consultaMenu->rowCount(); $i++){           
            $consultaSeccion = $->query("SELECT * FROM tb_submenus WHERE codimenu = $i ORDER BY codisecc ASC");

por

Citar
while ($i = $consultaMenu->fetch()){           
            $consultaSeccion = $->query("SELECT * FROM tb_submenus WHERE codimenu = ".$consultaMenu['codimenu']." ORDER BY codisecc ASC");

donde "$consultaMenu['codimenu']" es el valor de la columna 'codimenu' de tu tabla tb_menus

Suerte  :thumbsup:
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #2 : diciembre 14, 2011, 10:53:05 am »
Estimado este tipo de menus a veces son buenos presentarlos en una tabal de tipo tree, en donde hay una columna que dice el código del padre, y los que no tienen padre les podes poner 0 o null, la cosa es que luego los logras ordenar con una sola consulta a la BD, te jalas todos los menus y luego en una función los ordenas por padre e hijo. Pero si ya lo hiciste para la proxima tal vez lo practicas de esa otra manera y comparas a ver cual te gusta más.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #3 : diciembre 14, 2011, 10:58:22 am »
La verdad no estoy 100% a la gramática de PHP pero tu error es lógico...

Código: [Seleccionar]
for($i=1; $i <= $consultaMenu->rowCount(); $i++){           
            $consultaSeccion = $->query("SELECT * FROM tb_submenus WHERE codimenu = $i ORDER BY codisecc ASC");

por

donde "$consultaMenu['codimenu']" es el valor de la columna 'codimenu' de tu tabla tb_menus

Suerte  :thumbsup:

Tambien lo he probado asi y tampoco ha funcionado...

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #4 : diciembre 14, 2011, 11:02:04 am »
Estimado este tipo de menus a veces son buenos presentarlos en una tabal de tipo tree, en donde hay una columna que dice el código del padre, y los que no tienen padre les podes poner 0 o null, la cosa es que luego los logras ordenar con una sola consulta a la BD, te jalas todos los menus y luego en una función los ordenas por padre e hijo. Pero si ya lo hiciste para la proxima tal vez lo practicas de esa otra manera y comparas a ver cual te gusta más.

Y para este caso como lo haria, que tengo mal en esta funcion que no hace lo que necesito.

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #5 : diciembre 14, 2011, 11:11:42 am »
Comparti la estructura de las dos tablas, y los campos que estas usando como relación, para ver si se te fue la piscucha en algún valor de las consultas o en el proceso de agruparlos.

ken2

  • Visitante
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #6 : diciembre 14, 2011, 11:19:22 am »
No hagas eso.

En la misma función listarPanel construi tú menu, guarda la estructura del mismo
en una variable string, podria ser $menu1 y despues solo hacele echo a la variable.  :drinks:

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #7 : diciembre 14, 2011, 11:24:32 am »
No hagas eso.

En la misma función listarPanel construi tú menu, guarda la estructura del mismo
en una variable string, podria ser $menu1 y despues solo hacele echo a la variable.  :drinks:

A veces es necesario que los menus puedan ser editados sin tocar el codigo.

ken2

  • Visitante
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #8 : diciembre 14, 2011, 11:27:38 am »
A veces es necesario que los menus puedan ser editados sin tocar el codigo.

XD Y sino tocas el código para que sos programador jajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaajajajajaajajaajajajaaja

Desconectado moyo18

  • The Communiter-
  • *
  • Mensajes: 1719
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #9 : diciembre 14, 2011, 11:33:22 am »
yo digo q t sale mejor imprimir adentro del for..... deberias d usar un foreach. lo mismo q dice ken2



$consultaMenu = $db->query("SELECT * FROM tb_menus ORDER BY ordemenu ASC");
       
       
        foreach($consultaMenu as $menu){           
            $consultaSeccion = $->query("SELECT * FROM tb_submenus WHERE codimenu = $menu['id'] ORDER BY codisecc ASC");
            while($seccion = $consultaSeccion->fetch()){
                 aqui vas poniendo cada dato q queres pasar al html ....
            }           
        }

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #10 : diciembre 14, 2011, 12:11:47 pm »
yo digo q t sale mejor imprimir adentro del for..... deberias d usar un foreach. lo mismo q dice ken2



$consultaMenu = $db->query("SELECT * FROM tb_menus ORDER BY ordemenu ASC");
       
       
        foreach($consultaMenu as $menu){           
            $consultaSeccion = $->query("SELECT * FROM tb_submenus WHERE codimenu = $menu['id'] ORDER BY codisecc ASC");
            while($seccion = $consultaSeccion->fetch()){
                 aqui vas poniendo cada dato q queres pasar al html ....
            }           
        }

Esto es precisamente lo que no quiero hacer.

Supongamos que estoy utilizando el patron de diseño MVC y como saben en la Vista no deberia haber nada de SQL, por que esto va en el modelo, entonces en el modelo consulto a la base de datos y los presento en la vista, es por este motivo que se hace mas complicado.

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #11 : diciembre 14, 2011, 12:24:51 pm »
Estas utilizando kohana ? No has definido una relación entre padre e hijo para el modelo menu y el modelo submenu ? Pone la estructura de la bd solo quiero estar seguro cuales son las columnas relación que estas usando.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #12 : diciembre 14, 2011, 01:04:40 pm »
Ok, te muestro la relacion:


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #13 : diciembre 14, 2011, 01:05:13 pm »

Lo que puedes hacer es un LEFT JOIN entre las dos tablas (tb_menu y tb_submenus) contando con que tb_menu tenga un indice "ID_menu" concidiente en tb_submenus harias:

Código: [Seleccionar]
<?php

$c 
'SELECT ID_menu, ID_submenu, nombsecc FROM tb_menus LEFT JOIN tb_submenus USING(ID_menu)';
$r = $->query($c);

while (
$f mysql_fetch_assoc($r))
{
   
$menu[$f['ID_menu']][$f['ID_submenu']] = $f['nombresecc'];
}

return 
$menu;
?>


Ahi tendrias un array asociativo con el primer nivel diciendote el menu padre y el segundo los submenus.

XD Y sino tocas el código para que sos programador jajajaajajaajajajaajajajajaajajaajajajaaja....
Es algun tipo de chiste o es algo en serio?. A veces es necesario que el cliente de la aplicacion pueda agregar menus al sitio, la mejor opcion es dar una interfaz donde pueda agregarlos y generarlos dinamicamente desde la base de datos, en ese caso decirle al cliente que edite variables dentro del codigo esta fuera de contexto.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Retornar datos de una cosulta con ciclo anidado
« Respuesta #14 : diciembre 14, 2011, 01:39:05 pm »
Es algun tipo de chiste o es algo en serio?. A veces es necesario que el cliente de la aplicacion pueda agregar menus al sitio, la mejor opcion es dar una interfaz donde pueda agregarlos y generarlos dinamicamente desde la base de datos, en ese caso decirle al cliente que edite variables dentro del codigo esta fuera de contexto.

Y una vez tenga este array como lo recorreria?

Gracias.