Doctrine2中的陈述

时间:2012-01-10 16:51:07

标签: php symfony doctrine-orm

在我的存储库中我有

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方法的问题,documentationmore docs不够

1 个答案:

答案 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。我直到今天才意识到的事情:)