在我的存储库中我有
public function findAllMorosos($date = 'now')
{
$datetime = new \Datetime($date);
$stmt = $this->getEntityManager()
->getConnection()
->prepare(self::sql_morosos);
$stmt->bindValue(':fecha', $datetime, 'datetime');
if ($stmt->execute()) {
return $stmt;
}
return null;
}
我的SQL查询是
-- SQL
select p.* from inf_pago p
join inf_venta v on v.id = p.venta_id
join inf_cliente c on c.id = v.cliente_id
where p.fecha_pago < ':fecha'
and DATEDIFF(':fecha', p.fecha_pago) >= 30
and p.saldo_por_pagar != 0
当我执行$repository->findAllMorosos()
我得到空数组(期望1行)时,查询没问题。
当我尝试:
public function findAllMorosos($fecha = 'now')
{
$datetime = new \Datetime($fecha);
$stmt = $this->getEntityManager()
->getConnection()
->prepare(str_replace(':fecha', $datetime->format('Y-m-d'), self::sql_morosos));
if ($stmt->execute()) {
return $stmt;
}
return null;
}
工作正常。
可以解释bindValue
方法的问题,documentation和more docs不够
答案 0 :(得分:1)
我认为问题实际上在你的sql字符串中。不要将参数占位符包装在引号中。并且,我认为您需要多个占位符和绑定。将sql更改为:
where p.fecha_pago < :fecha1
and DATEDIFF(:fecha2, p.fecha_pago) >= 30
然后,以这种方式绑定:
$stmt->bindValue(':fecha1', $datetime, 'datetime');
$stmt->bindValue(':fecha2', $datetime, 'datetime');
注意,doctrine使用它自己的语句bindValue实现,它将第三个参数(如果是字符串)映射到PDO参数int。我直到今天才意识到的事情:)