Добрый день.
Хотел обратить внимание на одну новую особенность пользовательских полей и работы с ними через ORM.
Конкретно если создать множественное поле типа Строка, и вы полнить запрос с фильтром по нему:
то мы получим такой запрос:
который не принесёт результата, так как данные в поле таблицы хранятся с использованием serialize:
Такой запрос стал формироваться в последнем обновлении, которое я установил 04.06.2020
До этого формировался запрос с использованием отдельной таблицы для значений множественного поля:
Согласен запрос не ахти, и работает медленно, но об этом ниже.
Решение
Первое что приходит в голову, добавить в фильтр маску:
и это работает, но есть две проблемы:
И это решение тянет за собой реализацию в интерфейсе заполнения множественных значений значений и запись этих значений в этот отдельный hlblock, а в элемент с которым он связан идентификаторов.
ПС
А использование hlblock тоже проблематично, если у вас в нем несколько десятков тысяч строк, то открытие формы элемента у которого есть поле связанное с этим hlblockом вызовет долгий рендеринг страницы, а на слабом компьютере выскочит:
Хотел обратить внимание на одну новую особенность пользовательских полей и работы с ними через ORM.
Конкретно если создать множественное поле типа Строка, и вы полнить запрос с фильтром по нему:
$q = new \Bitrix\Main\Entity\Query(FAQArticleTable::getEntity()); $q->setSelect(['ID', 'UF_NAME']) ->setFilter(['UF_THEME' => ['MAIN'],]); |
SEL ECT `f_aq_article`.`ID` AS `ID`, `f_aq_article`.`UF_NAME` AS `UF_NAME` FR OM `b_faq` `f_aq_article` WHERE (UPPER(`f_aq_article`.`UF_THEME`) like upper('MAIN')) |
Такой запрос стал формироваться в последнем обновлении, которое я установил 04.06.2020
До этого формировался запрос с использованием отдельной таблицы для значений множественного поля:
SELECT `f_aq_article`.`ID` AS `ID`, `f_aq_article`.`UF_NAME` AS `UF_NAME` FR OM `b_faq` `f_aq_article` WH ERE `f_aq_article`.`ID` IN (SELECT `f_aq_article_tmp880275262`.`ID` AS `ID` FR OM `b_faq` `f_aq_article_tmp880275262` LEFT JOIN `b_faq_uf_theme` `f_aq_article_f_aq_article_utm_uf_theme_object_tmp880275262` ON `f_aq_article_f_aq_article_utm_uf_theme_object_tmp880275262`.`ID` = `f_aq_article_tmp880275262`.`ID` WH ERE (UPPER(`f_aq_article_f_aq_article_utm_uf_theme_object_tmp880275262`.`VALUE`) like upper('MAIN'))) |
Решение
Первое что приходит в голову, добавить в фильтр маску:
$q = new \Bitrix\Main\Entity\Query(FAQArticleTable::getEntity()); $q->setSelect(['ID', 'UF_NAME']) ->setFilter(['UF_THEME' => ['%MAIN%'],]); |
- Менять это во всех местах использования множественных строк.
- Но главная проблема - это получение не верных результатов, этот запрос отберёт все строки таблицы, в которых поле содержит заданную маску.
И это решение тянет за собой реализацию в интерфейсе заполнения множественных значений значений и запись этих значений в этот отдельный hlblock, а в элемент с которым он связан идентификаторов.
ПС
А использование hlblock тоже проблематично, если у вас в нем несколько десятков тысяч строк, то открытие формы элемента у которого есть поле связанное с этим hlblockом вызовет долгий рендеринг страницы, а на слабом компьютере выскочит: