Doctrine DQL - Logi c проверка выбора - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь использовать LIKE сравнение в doctrine DQL в MySQL базе данных. Он работает непосредственно в SQL в базе данных и выглядит следующим образом:

SELECT *, (name LIKE '%testO%') as partOfName
from organization
ORDER BY partOfName DESC;

Это прекрасно работает.

Теперь я пытаюсь реализовать эту логику c в Doctrine. Мой Querybuilder выглядит следующим образом:

oQueryBuilder
  ->from(OrganizationEntity::class, organization)
  ->select('organization')
  ->addSelect('(organization.name LIKE %:searchTerm%) AS searchTermIsPartOfName')
  ->setParameter('searchTerm', $sSearchTerm)
  ->orderBy('searchTermIsPartOfName', 'DESC')
;

При попытке запустить его или получить SQL из него выдается следующая ошибка:

[Ошибка синтаксиса] строка 0, col 97: ошибка: ожидаемая доктрина \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS, полученная «LIKE»

Это определенно часть о LIKE. Я прокомментировал последние три строки, и это работает.

Как мне перевести вышеприведенный рабочий SQL в Doctrine DQL?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

LIKE выражения включены в Условные выражения в грамматике DQL. И, к сожалению, невозможно использовать их непосредственно в SelectExpression.

Однако вы можете использовать их в CaseExpression, который может использоваться в SelectExpression, и повторить то же поведение:

->addSelect('CASE WHEN (organization.name LIKE :searchTerm) THEN 1 ELSE 0 END AS searchTermIsPartOfName')
->setParameter('searchTerm', "%{$sSearchTerm}%")

(была также небольшая проблема с вашим выражением LIKE - я почти уверен, что знаки % должны быть частью значения параметра, а не запроса сам по себе)

0 голосов
/ 06 февраля 2020

вы забыли '' после LIKE, замените на строку

->addSelect('(organization.name LIKE %:searchTerm%) AS searchTermIsPartOfName')

на

->addSelect('(organization.name LIKE \'%:searchTerm%\') AS searchTermIsPartOfName')
...