Расширение Doctrine SUBSTRING_INDEX выдает ошибку в построителе запросов

Я пытаюсь использовать расширение доктрины SUBSTRING_INDEX для выбора всех переводов, которые были сделаны с номера счета, используя приведенный ниже запрос. t.fromAccount — это текстовое поле, например. «Текущий счет Gold — 25547845965851». Номер счета после тире.

  public function findTransfersByAccountNumber($accountNumber)
{
    $qb = $this->getTransferQuery()
               ->leftJoin('t.customer', 'c')
               ->where("SUBSTRING_INDEX(t.fromAccount, '-', -1) = :accountNumber")
               ->orderBy('t.dateCreated','DESC')
               ->setParameter('accountNumber',$accountNumber);
    return $qb->getQuery()->getResult();        
}

Но доктрина выдает эту ошибку «[Синтаксическая ошибка] строка 0, столбец 117: Ошибка: ожидаемый литерал, получено '-'». Как ни странно, если я изменяю -1 на 1, он работает без ошибок, но ничего не возвращает.

Может ли кто-нибудь указать мне в правильном направлении?


person Ernest Boabramah    schedule 22.05.2017    source источник
comment
Полная догадка, но что, если вы процитируете -1?   -  person Don't Panic    schedule 22.05.2017
comment
добавление кавычек приводит к этой ошибке Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное «если» (T_IF), ожидающая функция (T_FUNCTION).   -  person Ernest Boabramah    schedule 22.05.2017


Ответы (1)


На основе рекомендации комментария к вопросу здесь
в котором говорится, что дефисы не допускаются, так как они могут быть частью атаки путем внедрения SQL-кода. Либо избавьтесь от тире, либо разбейте отрицательное число на параметр. Приведенный ниже код работал, как и ожидалось.

public function findTransfersByAccountNumber($accountNumber)
{
    return $this->getTransferQuery()
        ->leftJoin('t.customer', 'c')
        ->where("SUBSTRING_INDEX(t.fromAccount, '-', :offset) = :accountNumber")
        ->orderBy('t.dateCreated','DESC')
        ->setParameter('accountNumber',$accountNumber)
        ->setParameter('offset','-1')
        ->getQuery()->getResult();

}
person Ernest Boabramah    schedule 25.05.2017