【问题标题】:How to fix this query using Zend Framework2如何使用 Zend Framework2 修复此查询
【发布时间】:2014-10-19 01:05:44
【问题描述】:

我正在使用 ZendFramework2,我需要进行自定义查询。我在 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;

【问题讨论】:

  • 唯一的区别是在 zf2 中你没有为Actividad 表使用别名。你有什么错误吗?
  • @blackbishop 哦不,这不是错误。这是因为该语句属于连接而不是整个查询

标签: php mysql zend-framework zend-framework2 zend-db


【解决方案1】:

连接查询中的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');

【讨论】:

  • 谢谢你,我修好了,经过 4 小时的查找。我不知道 Expression()
  • 在这个问题中我还有一个关于 Zend Framework 的问题,也许你可以帮助我。谢谢你。 stackoverflow.com/questions/26638022/…
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
相关资源
最近更新 更多