Doctrine Query Builder / DQL — Как написать запрос с WHERE column = ДВОИЧНЫЙ ‘текст’

#php #symfony #doctrine #dql #doctrine-query

Вопрос:

Как бы я написал запрос, такой как:

 SELECT id FROM Records WHERE name = BINARY 'My Record';
 

Использование Doctrine Query Builder? 'My Record' может быть любое произвольное имя для запроса.

Следующее не работает… Честно говоря, я не ожидал, что это сработает, но я не могу придумать ничего другого, чтобы попробовать.

 // Assume $repo is the Records repository
// Assume $name is the name to query, such as "My Record"
$repo->createQueryBuilder('r')
  ->select('r.id')
  ->where('r.name = BINARY :name')
  ->setParameter('name', $name)
  ->getQuery()
  ->getResult();
 

Комментарии:

1. Насколько я понимаю, если поле правильно сопоставлено с этим типом, Doctrine должна обрабатывать все, что требуется для преобразования данных при установке параметра. Работает ли это, если вы просто опускаете BINARY свое where предложение?

2. Было бы хорошо показать соответствующие части объекта (отображение полей, средство получения и установки)

3. @ArleighHix Я думаю, вы неправильно поняли мой вопрос. Речь идет не о преобразовании данных или о чем-то подобном. Мой вопрос заключается в том, как выполнить этот конкретный SQL-запрос с помощью Doctrine query builder.

4. Нет, Doctrine должна создать соответствующий запрос для настроенной базы данных на основе сопоставления полей, которое вы не показываете.

5. Если это двоичный тип данных в базе данных, то он преобразует строковый параметр php в двоичное значение в запросе.

Ответ №1:

Для поддержки любой функции DQL, не предусмотренной Doctrine ORM, необходимо использовать пользовательскую пользовательскую функцию.

Установите библиотеку DoctrineExtensions, как предложено в документации Doctrine.

 composer require beberlei/doctrineextensions
 

Включите расширение BINARY типа в конфигурации Symfony doctrine.

 # config/packages/doctrine.yaml

doctrine:
    orm:
       # ...
       dql:
           string_functions:
               binary: DoctrineExtensionsQueryMysqlBinary
 

Теперь ваши операторы DQL должны поддерживать r.name = BINARY(:name)


Полный список предоставляемых расширений типа DQL для MySQL.

 datetime_functions:
    addtime: DoctrineExtensionsQueryMysqlAddTime
    convert_tz: DoctrineExtensionsQueryMysqlConvertTz
    date: DoctrineExtensionsQueryMysqlDate
    date_format: DoctrineExtensionsQueryMysqlDateFormat
    dateadd: DoctrineExtensionsQueryMysqlDateAdd
    datesub: DoctrineExtensionsQueryMysqlDateSub
    datediff: DoctrineExtensionsQueryMysqlDateDiff
    day: DoctrineExtensionsQueryMysqlDay
    dayname: DoctrineExtensionsQueryMysqlDayName
    dayofweek: DoctrineExtensionsQueryMysqlDayOfWeek
    dayofyear: DoctrineExtensionsQueryMysqlDayOfYear
    div: DoctrineExtensionsQueryMysqlDiv
    from_unixtime: DoctrineExtensionsQueryMysqlFromUnixtime
    hour: DoctrineExtensionsQueryMysqlHour
    last_day: DoctrineExtensionsQueryMysqlLastDay
    makedate: DoctrineExtensionsQueryMysqlMakeDate
    minute: DoctrineExtensionsQueryMysqlMinute
    now: DoctrineExtensionsQueryMysqlNow
    month: DoctrineExtensionsQueryMysqlMonth
    monthname: DoctrineExtensionsQueryMysqlMonthName
    period_diff: DoctrineExtensionsQueryMysqlPeriodDiff
    second: DoctrineExtensionsQueryMysqlSecond
    sectotime: DoctrineExtensionsQueryMysqlSecToTime
    strtodate: DoctrineExtensionsQueryMysqlStrToDate
    time: DoctrineExtensionsQueryMysqlTime
    timediff: DoctrineExtensionsQueryMysqlTimeDiff
    timestampadd: DoctrineExtensionsQueryMysqlTimestampAdd
    timestampdiff: DoctrineExtensionsQueryMysqlTimestampDiff
    timetosec: DoctrineExtensionsQueryMysqlTimeToSec
    truncate: DoctrineExtensionsQueryMysqlTruncate
    week: DoctrineExtensionsQueryMysqlWeek
    weekday: DoctrineExtensionsQueryMysqlWeekDay
    weekofyear: DoctrineExtensionsQueryMysqlWeekOfYear
    year: DoctrineExtensionsQueryMysqlYear
    yearmonth: DoctrineExtensionsQueryMysqlYearMonth
    yearweek: DoctrineExtensionsQueryMysqlYearWeek
    unix_timestamp: DoctrineExtensionsQueryMysqlUnixTimestamp
    utc_timestamp: DoctrineExtensionsQueryMysqlUtcTimestamp
    extract: DoctrineExtensionsQueryMysqlExtract

numeric_functions:
    acos: DoctrineExtensionsQueryMysqlAcos
    asin: DoctrineExtensionsQueryMysqlAsin
    atan2: DoctrineExtensionsQueryMysqlAtan2
    atan: DoctrineExtensionsQueryMysqlAtan
    bit_count: DoctrineExtensionsQueryMysqlBitCount
    bit_xor: DoctrineExtensionsQueryMysqlBitXor
    ceil: DoctrineExtensionsQueryMysqlCeil
    cos: DoctrineExtensionsQueryMysqlCos
    cot: DoctrineExtensionsQueryMysqlCot
    degrees: DoctrineExtensionsQueryMysqlDegrees
    exp: DoctrineExtensionsQueryMysqlExp
    floor: DoctrineExtensionsQueryMysqlFloor
    json_contains: DoctrineExtensionsQueryMysqlJsonContains
    json_depth: DoctrineExtensionsQueryMysqlJsonDepth
    json_length: DoctrineExtensionsQueryMysqlJsonLength
    log: DoctrineExtensionsQueryMysqlLog
    log10: DoctrineExtensionsQueryMysqlLog10
    log2: DoctrineExtensionsQueryMysqlLog2
    pi: DoctrineExtensionsQueryMysqlPi
    power: DoctrineExtensionsQueryMysqlPower
    quarter: DoctrineExtensionsQueryMysqlQuarter
    radians: DoctrineExtensionsQueryMysqlRadians
    rand: DoctrineExtensionsQueryMysqlRand
    round: DoctrineExtensionsQueryMysqlRound
    stddev: DoctrineExtensionsQueryMysqlStdDev
    sin: DoctrineExtensionsQueryMysqlSin
    std: DoctrineExtensionsQueryMysqlStd
    tan: DoctrineExtensionsQueryMysqlTan
    variance: DoctrineExtensionsQueryMysqlVariance

string_functions:
    aes_decrypt: DoctrineExtensionsQueryMysqlAesDecrypt
    aes_encrypt: DoctrineExtensionsQueryMysqlAesEncrypt
    any_value: DoctrineExtensionsQueryMysqlAnyValue
    ascii: DoctrineExtensionsQueryMysqlAscii
    binary: DoctrineExtensionsQueryMysqlBinary
    cast: DoctrineExtensionsQueryMysqlCast
    char_length: DoctrineExtensionsQueryMysqlCharLength
    collate: DoctrineExtensionsQueryMysqlCollate
    concat_ws: DoctrineExtensionsQueryMysqlConcatWs
    countif: DoctrineExtensionsQueryMysqlCountIf
    crc32: DoctrineExtensionsQueryMysqlCrc32
    degrees: DoctrineExtensionsQueryMysqlDegrees
    field: DoctrineExtensionsQueryMysqlField
    find_in_set: DoctrineExtensionsQueryMysqlFindInSet
    format: DoctrineExtensionsQueryMysqlFormat
    from_base64: DoctrineExtensionsQueryMysqlFromBase64
    greatest: DoctrineExtensionsQueryMysqlGreatest
    group_concat: DoctrineExtensionsQueryMysqlGroupConcat
    hex: DoctrineExtensionsQueryMysqlHex
    ifelse: DoctrineExtensionsQueryMysqlIfElse
    ifnull: DoctrineExtensionsQueryMysqlIfNull
    inet_aton: DoctrineExtensionsQueryMysqlInetAton
    inet_ntoa: DoctrineExtensionsQueryMysqlInetNtoa
    inet6_aton: DoctrineExtensionsQueryMysqlInet6Aton
    inet6_ntoa: DoctrineExtensionsQueryMysqlInet6Ntoa
    instr: DoctrineExtensionsQueryMysqlInstr
    is_ipv4: DoctrineExtensionsQueryMysqlIsIpv4
    is_ipv4_compat: DoctrineExtensionsQueryMysqlIsIpv4Compat
    is_ipv4_mapped: DoctrineExtensionsQueryMysqlIsIpv4Mapped
    is_ipv6: DoctrineExtensionsQueryMysqlIsIpv6
    lag: DoctrineExtensionsQueryMysqlLag
    lead: DoctrineExtensionsQueryMysqlLead
    least: DoctrineExtensionsQueryMysqlLeast
    lpad: DoctrineExtensionsQueryMysqlLpad
    match: DoctrineExtensionsQueryMysqlMatchAgainst
    md5: DoctrineExtensionsQueryMysqlMd5
    nullif: DoctrineExtensionsQueryMysqlNullIf
    over: DoctrineExtensionsQueryMysqlOver
    radians: DoctrineExtensionsQueryMysqlRadians
    regexp: DoctrineExtensionsQueryMysqlRegexp
    replace: DoctrineExtensionsQueryMysqlReplace
    rpad: DoctrineExtensionsQueryMysqlRpad
    sha1: DoctrineExtensionsQueryMysqlSha1
    sha2: DoctrineExtensionsQueryMysqlSha2
    soundex: DoctrineExtensionsQueryMysqlSoundex
    str_to_date: DoctrineExtensionsQueryMysqlStrToDate
    substring_index: DoctrineExtensionsQueryMysqlSubstringIndex
    unhex: DoctrineExtensionsQueryMysqlUnhex
    uuid_short: DoctrineExtensionsQueryMysqlUuidShort