如何使用Zend Framework2修复此查询


How to fix this query using Zend Framework2

我正在使用ZendFramework2,需要进行一个custon查询。我在mysql中尝试了我的查询,它运行得很好。

SELECT p.idProyecto,p.nombre, e.nombre, e.apellido, sum(ar.tiempoEstimado) 
       estimado,DATE_FORMAT(p.fechaInicio, '%Y/%m/%d') as inicio, 
       DATE_FORMAT(p.fechaFin, '%Y/%m/%d') as fin, sum(r.tiempoRegistrado) as t_real 
FROM Actividad as a 
LEFT JOIN ActividadResponsable as ar 
  ON a.idActividad=ar.idActividad 
  and a.fechaInicio>="2014-10-13"   
  and a.fechaFin<="2014-10-19" 
LEFT JOIN ActividadPlaneada as ap 
  On ap.idActividad = ar.idActividad 
  and ar.idActividad = a.idActividad 
LEFT JOIN tipoActividad as ta 
  on ta.idTipoActividad= ap.idTipoActividad
LEFT JOIN proyecto as p 
  ON p.idProyecto=a.idProyecto 
LEFT JOIN registro as r 
  ON a.idActividad=r.idActividad 
  and r.fechaRegistro>="2014-10-13 00:00:00" 
  and r.fechaRegistro<="2014-10-19 23:59:00" 
LEFT JOIN empleado as e 
  ON p.creador = e.idEmpleado
GROUP BY a.idProyecto;

但当我把它编码到ZendFramework2中时,它会改变这个

LEFT JOIN ActividadResponsable as ar 
ON a.idActividad=ar.idActividad 
and a.fechaInicio>="2014-10-13" 
and a.fechaFin<="2014-10-19" 

所以zend生成的结果查询是

SELECT p.idProyecto, p.nombre, e.nombre, e.apellido, SUM(ar.tiempoEstimado) as estimado, p.fechaInicio as inicio, p.fechaFin as fin, sum(r.tiempoRegistrado) as t_real 
FROM `Actividad` 
LEFT JOIN `ActividadResponsable` AS `ar` ON `Actividad`.`idActividad`=`ar`.`idActividad` 
LEFT JOIN `ActividadPlaneada` AS `ap` ON `ap`.`idActividad` = `ar`.`idActividad` and `ar`.`idActividad` = `Actividad`.`idActividad` 
LEFT JOIN `TipoActividad` AS `ta` ON `ta`.`idTipoActividad`= `ap`.`idTipoActividad` 
LEFT JOIN `Proyecto` AS `p` ON `p`.`idProyecto`=`Actividad`.`idProyecto` 
LEFT JOIN `Registro` AS `r` ON `Actividad`.`idActividad`=`r`.`idActividad` 
LEFT JOIN `Empleado` AS `e` ON `p`.`creador` = `e`.`idEmpleado` 
WHERE `Actividad`.`fechaInicio` >= :where1 AND `Actividad`.`fechaFin` <= :where2 AND `r`.`fechaRegistro` >= :where3 AND `r`.`fechaRegistro` <= :where4 
GROUP BY `Actividad`.`idProyecto`

我的php代码是这个

$dbAdapterConfig = array(
  'driver'   => 'Pdo_Mysql',
  'database' => '*',
  'username' => '*',
  'password' => '*',
  'charset'  => 'utf8'
);
$dbAdapter = new Adapter($dbAdapterConfig);
$sql = new Sql($dbAdapter);
$query = $sql->select();
$query->from('Actividad');
$query->columns(array(new 'Zend'Db'Sql'Expression('p.idProyecto, p.nombre, e.nombre, e.apellido, SUM(ar.tiempoEstimado) as estimado, p.fechaInicio as inicio, p.fechaFin as fin, sum(r.tiempoRegistrado) as t_real')));
$query->join(array('ar' => 'ActividadResponsable'),   'Actividad.idActividad=ar.idActividad', array(), 'left');
$query->where->greaterThanOrEqualTo('Actividad.fechaInicio', $inicio);
$query->where->lessThanOrEqualTo('Actividad.fechaFin', $fin);
$query->join(array('ap' => 'ActividadPlaneada'),   'ap.idActividad = ar.idActividad and ar.idActividad = Actividad.idActividad', array(), 'left');
$query->join(array('ta' => 'TipoActividad'),   'ta.idTipoActividad= ap.idTipoActividad', array(), 'left');
$query->join(array('p' => 'Proyecto'),   'p.idProyecto=Actividad.idProyecto', array(), 'left');
$query->join(array('r' => 'Registro'),   'Actividad.idActividad=r.idActividad', array(), 'left');
$query->where->greaterThanOrEqualTo('r.fechaRegistro', "2014-10-13 00:00:00");
$query->where->lessThanOrEqualTo('r.fechaRegistro', "2014-10-19 23:59:00");
$query->join(array('e' => 'Empleado'), 'p.creador = e.idEmpleado', array(), 'left');
$query->group(array('Actividad.idProyecto'));
$statement = $sql->prepareStatementForSqlObject($query);
$result = $statement->execute();
$records = array();
foreach ($result as $return) {
  $records[] = $return;
}
return $result;

联接查询中的and属于联接on语句,而不是查询where语句,您需要将on语句添加为Expression,如下所示:

$exp = new Expression('Actividad.idActividad=ar.idActividad and a.fechaInicio>=? 
and a.fechaFin<=?',array($inicio,$fin));
$query->join(array('ar' => 'ActividadResponsable'),  $exp , array(), 'left');