Я использую 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');
Других решений пока нет …