alvaro-prieto
6/2/2017 - 7:56 AM

listaExpandida

listaExpandida. Vídeo: https://youtu.be/P2EFJ2ULf8k?t=122

IMPORTANTE: La lista expandida siempre empieza desde la clase en la que queremos que haya un registro por fila. Es decir:

MisLibros->lista() tendrá el mismo numero de líneas que MisLibros->listaExpandida(....)

Josean me ha dicho que existe una limitacion en el framework, y es que no se puede pasar por la misma clase dos veces. Hay que tenerlo en cuenta! Normalmente se puede solucionar haciendo dos queries en vez de una , con la primera se sacan los id de lo que sea, y en la segunda se utiliza un in(...)

La clase de inicio es la que queremos que tenga un registro por fila

  • Tener en cuenta que nunca hay que escribir la clase de inicio en los campos, ni en los derivados. Si en este caso HumbPreguntasOpciones se relaciona con HubPreguntas, podemos poner HubPreguntas directamente.
  • Si un campo tiene multiples registros, se agrupan automáticamente por comas, fijarse en el campo idConector
  • En una lista expandida, se pueden aplicar filtros sobre la clase actual o cualquiera de las anteriores.
$listado = $this->HubPreguntasOpciones->listaExpandida("
    id as id, 
    HubPreguntas.id as idPregunta, 
    HubPreguntas.pregunta as pregunta, 
    opcion as opcion, 
    id as idOpcion, 
    HubPreguntasConectores.id as idConector");

Resultado (truncado):

array (size=10)
2 => 
  array (size=6)
    'id' => string '2' (length=1)
    'idPregunta' => string '2' (length=1)
    'pregunta' => string '¿Quieres asesoramiento sobre cómo innovar en tu asignatura?' (length=61)
    'opcion' => string 'Sí, pero no sé cómo' (length=22)
    'idOpcion' => string '2' (length=1)
    'idConector' => string '4, 6' (length=4)  // <-- ves! se han unido!
4 => 
  array (size=6)
    'id' => string '4' (length=1)
    'idPregunta' => string '2' (length=1)
    'pregunta' => string '¿Quieres asesoramiento sobre cómo innovar en tu asignatura?' (length=61)
    'opcion' => string 'Sí, sobre aprendizaje activo' (length=29)
    'idOpcion' => string '4' (length=1)
    'idConector' => string '2,4,6' (length=2) // <-- ves! se han unido!
Lista expandida es bastante poderoso.  Vídeo: https://youtu.be/P2EFJ2ULf8k?t=122

Se basa en en el cocepto de las relaciones,
pero no es necesario indicar todas las relaciones de las cuales queremos obtener 
información.

Así si por ejemplo necesitamos información sobre un libro y sobre su autor, 
normalmente podríamos tener relaciones así:

$Libro->Autores->Libros->Capitulos->lista(...)

para asi poder acceder a info del autor, y de los capitulos. 

Con Lista expandida es más cómod porque podemos realizar las ramas de expansión
dentro del lista, de manera que evitamos algunos problemas y es todo más fácil:

$Libro->listaExpandida("Libro.Autor.nombre as nombreAutor, Libro.Capitulos.loquesea");

Ejemplos reales:


En este ejemplo, queremos información de los reconocimientos del ultimo mes, pero 
para ello necesitamos acceder a SgicNodos texto. Podemos expandirlo directamente
en el campo como veremos aquí:

	$this->SgicTareas->PersonalReconocimiento->apilaEstado();
	$hoy = new Fecha();
	$this->SgicTareas->PersonalReconocimiento->añadeFiltro("DATEDIFF('{$hoy->mysqlCompleto()}', PersonalReconocimiento.fecha) <=30");
	$lista = $this->SgicTareas->PersonalReconocimiento->lista("count(*) as 'countUltimoMes");
	$ultimoMes  = current($lista)["countUltimoMes"];
	$reconocimientosDelMes = $this->SgicTareas->PersonalReconocimiento->listaExpandida("reconocimiento, idusuario_emisor as idemisor, id, SgicTareas.Usuario.nombre as nombreReceptor, SgicTareas.Usuario.apellidos as apellidosReceptor, 'qProcesos' as entidad, SgicTareas.SgicNodos.texto as descripcion");
	$this->SgicTareas->PersonalReconocimiento->desapilaEstado();	

Otro ejemplo, queremos todos los logros, ordenados por fecha, con información sobre 
quien los ha conseguido. 

$PersonalLogros = new PersonalLogros();
$logros = $PersonalLogros->PersonalLogrosUsuarios->orden("fecha desc");
$logros = $PersonalLogros->PersonalLogrosUsuarios->listaExpandida("PersonalLogros.id as id, PersonalLogros.logro as logro,  PersonalLogros.descripcion as descripcion, PersonalLogros.icono as icono, PersonalLogros.color as color, PersonalLogros.oculto as oculto, PersonalLogros.tipo as tipo,  PersonalLogrosUsuarios.Usuario.nombre as nombre, PersonalLogrosUsuarios.Usuario.apellidos as apellidos, PersonalLogrosUsuarios.fecha as fecha, PersonalLogrosUsuarios.idusuario as idreceptor");