Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Consulta avanzada de fechas con Doctrine

5 de abril de 2015

Hola, primero de todo deciros que soy nuevo con Symfony2. Estoy migrando a Symfony una aplicación hecha con CodeIgniter. El problema lo tengo con la consulta a la base de datos. Aquí pego el código y lo explico:

public function horario($id_user,$anio,$mes)
{
    $query = $this->db->query("
      SELECT id_user,
             SUBTIME(hora_salida,hora_entrada) AS saldo,
             DATE_FORMAT(fecha,'%d/%m/%Y') AS fecha,
             DATE_FORMAT(fecha,'%W') AS dia, 
             DATE_FORMAT(fecha,'%Y-%m-%d') AS enlace,
             TIME_FORMAT(hora_entrada,'%H:%i') AS hora_entrada,
             TIME_FORMAT(hora_salida,'%H:%i') AS hora_salida
      FROM horario
      WHERE (id_user= '$id_user') & (MONTH (fecha)='$mes') & (YEAR (fecha)='$anio')
      ORDER BY fecha ASC
    ");
 
    return $query->result();
}
public function saldo_mensual($id_user,$anio,$mes)
{
    $resultado = $this->db->query(
      "SELECT SUBTIME(SEC_TO_TIME(sum(TIME_TO_SEC(hora_salida))), SEC_TO_TIME(sum(TIME_TO_SEC(hora_entrada)))) AS saldo,
              SEC_TO_TIME(sum(TIME_TO_SEC(hora_saldo))) AS super_saldo
       FROM horario
       WHERE (id_user='$id_user') & (MONTH (fecha)='$mes') & (YEAR (fecha)='$anio') & (hora_salida != '00:00:00')"
    );
 
    return $resultado->result();   
}

El primero me calcula la diferencia entre dos horas, (entrada y salida) y me genera el saldo. Lo he conseguido en symfon con este código:

$conn = $this->get('database_connection');
 
$entities = $conn->fetchAll(
  'SELECT *,
          DATE_FORMAT(fecha,\'%W\') AS dia,
          SUBTIME(horaSalida,horaEntrada) AS saldo
   FROM Horario
   ORDER BY fecha ASC'
);

Pero con Doctrine no hay manera y he revisado su documentación, foros de todo y nada. El problema concreto está en SUBTIME. No consigo hacer la resta de dos columnas y estoy convencido que debe tener forma, pero me lanza error. Gracias de antemano y disculpar por lo extenso del tema.


Respuestas

#1

@casasxavi antes que nada, y aunque seguramente ya lo sabes, Doctrine es un proyecto totalmente independiente a Symfony. Te lo comento porque como dices que eres nuevo en Symfony y vienes de CodeIgniter, quizás encuentres que Doctrine es la parte más difícil de este cambio.

Respecto a lo que quieres hacer: el problema de Doctrine es que es un ORM, lo que significa que ofrece las mismas funcionalidades en todas las bases de datos. En la práctica esto supone que no dispones de casi ninguna función propia de las bases de datos.

Una posible solución sería definir tus propias funciones DQL para usarlas en las consultas de Doctrine y después registrar esas funciones en Symfony. En cualquier caso, como estás empezando con Symfony, hacer esto sería una locura porque es muy avanzado.

Así que para este caso particular te aconsejo que te olvides de las propias consultas de Doctrine y ejecutes directamente el SQL de la siguiente manera (te pongo un ejemplo de cómo hacerlo dentro de un controlador):

$sql = "SELECT ...";
$stmt = $this->getDotrine()->getManager()->getConnection()->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();

@javiereguiluz

7 abril 2015, 9:26
#2

Hola, primero pedir disculpas por mi tardanza en contestar y segundo, darte las gracias.

Llevas razón al decir que Doctrine es una de las partes más difíciles del cambio, pero lo que voy conociendo me encanta; nada que ver con CodeIgniter.

Miraré bien las consultas direcamente al SQL y ya te comentaré. Una vez más, gracias.

@casasxavi

11 abril 2015, 16:55