Заявление в Учении2 - PullRequest
       0

Заявление в Учении2

0 голосов
/ 10 января 2012

в моем хранилище у меня есть

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, документация и больше документов недостаточно

1 Ответ

1 голос
/ 10 января 2012

Проблема, я думаю, на самом деле в вашей строке 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. Что-то, чего я не осознавал до сегодняшнего дня:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...