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.

-~----------~----~----~----~------~----~------~--~---

Responder a