Hola. Estuve intentando hacer la consultas a con $this->query(), pero no obtengo los resultados tal y como los quiero. Tengo las bases de datos así:
socios +----------------+---------------------+- | id | int(10) unsigned | nombre | varchar(30) | aPat | varchar(30) | aMat | varchar(30) | pais | varchar(30) | estado | varchar(30) | direccion | varchar(255) | telefono | varchar(12) | email | varchar(128) +----------------+------------------- membresias +---------------+---------------------+ | id | int(10) unsigned | socio_id | int(10) unsigned | anio | varchar(5) | fecha_pago | date | recibo | varchar(10) +----------------+------------------- El problema es que necesito sacar la lista de socios y su membresía más reciente, y esta información se pone en pantalla y se debe poder ordenar por los diversos campos antes de crear el csv. Intenté obtener la lista de socios y de ahí crear un array con su membresía más reciente (que si pude), pero quisiera encontrar el modo de reordenar esa información sin estar procesando cada ocasión lo mismo (el uso del procesador sube mucho en ese paso). Lo hago más o menos así: $this->Socio->findAll(); $vigentes = array(); $vencidos = array(); $i = $j = 0; foreach ($socios as $socio) { $renglon = array('nombre' => $socio['Socio']['nombre'].' '. $socio['Socio']['aPat'].' '.$socio['Socio']['aMat'], 'email' => $socio['Socio']['email']); $m1 = $m2 = array('', '', ''); foreach ($socio['Membresia'] as $membresia) { // encontramos la más reciente $m1 = array($membresia['id'], $membresia['anio'], $membresia['fecha_pago']); if ($m2[1] > $m1[1]) { $datos = $m2; } else { $m2 = $m1; $datos = $m1; } } $caducidad = strtotime($datos[2]) + (365 * 24 * 60 * 60); // membresia anual if ($caducidad - time() > 0) { $vigentes = $vigentes + array($i => array_merge($renglon, array('membresia' => $datos[0], 'anio' => $datos[1], 'fecha_pago' => $datos[2]))); $i++; } else { $vencidos = $vencidos + array($j => array_merge($renglon, array('membresia' => $datos[0], 'anio' => $datos[1], 'fecha_pago' => $datos[2]))); $j++; } } Cuando hago la consulta por el modelo de membresías se me complica un poco más por que cada registro sería una membresía, y de ahí no sabría cómo podría obtener la más reciente por socio. Lo último que estuve intentando es usa consultas con $this->query, pero no encuentro la adecuada. En este momento andaba jugando con esta (y variantes): $consulta = 'SELECT CONCAT(Socio.nombre," ",Socio.aPat," ",Socio.aMat) as name, Socio.id, Socio.nombre, Socio.aPat, Socio.aMat, Socio.email, Membresia.id, Membresia.anio, Membresia.fecha_pago FROM socios AS Socio RIGHT JOIN membresias as Membresia ON (Membresia.socio_id = Socio.id) WHERE Membresia.fecha_pago < $alguna_fecha GROUP BY name ORDER BY anio ASC, fecha_pago ASC, aPat ASC, aMat ASC, nombre ASC' Como hay membresía de años atrás y sólo quiero la más reciente de cada socio, hago el GROUP BY name para tener sólo una por socio, pero el problema es que las membresías no salen en el orden deseado, de hecho salen sin ningún orden, y al hacer el GROUP BY queda cualquiera, no la más reciente. Y bueno, al final es un detalle solamente, pero es un detalle que no he podido resolver. ¿Alguien tiene alguna idea? Saludos. On 4 dic, 19:58, Gerardo Glez <[EMAIL PROTECTED]> wrote: > Fractalix, > > Prueba haciendo la consulta a la inversa en el modelo que tenga la > relacion belongsTo (o sea usando el JOIN que aplica en esa relacion). > Algo asi como $this->Socio->Membresia->findAll('Membresia.fecha_pago > > >= '.$fecha_pago); --~--~---------~--~----~------------~-------~--~----~ Has recibido este mensaje porque estás suscrito a Grupo "CakePHP-es" de Grupos de Google. Si quieres publicar en este grupo, envía un mensaje de correo electrónico a CakePHP-es@googlegroups.com Para anular la suscripción a este grupo, envía un mensaje a [EMAIL PROTECTED] Para obtener más opciones, visita este grupo en http://groups.google.com/group/CakePHP-es?hl=es. -~----------~----~----~----~------~----~------~--~---