Рейтинг: 3  
Новая
Предложил Малюгин Виктор 22.01.2019 18:45:26

Агрегирующие поля в объектах

Раньше чтоб получить, например, список групп пользователя я мог выполнить запрос
$arUser = \Bitrix\Main\UserTable::getList([
  'select' => ['ID', 'LOGIN', 'GROUP_LIST'],
  'runtime' => [
      new \Bitrix\Main\Entity\ReferenceField(
          'GROUP_REF',
          \Bitrix\Main\UserGroupTable::getEntity(),
          [
              '=this.ID' => 'ref.USER_ID'
          ]
      ),
      new \Bitrix\Main\Entity\ExpressionField(
          'GROUP_LIST',
          'GROUP_CONCAT(DISTINCT %s SEPARATOR "[#]")',
          'GROUP_REF.GROUP_ID',
          [
              'fetch_data_modification' => function () {
                  return [
                      function ($val) {
                          if (empty($val)) {
                              return [];
                          }

                          return explode("[#]", $val);
                      }
                  ];
              }
          ]
      )
  ]
])->fetch();

и в $arUser['GROUP_LIST'] был список идентификаторов групп.
В парадигме объектов агрегирующие поля запрещены - при fetchObject бросается исключение "Result of query with aggregation could not be fetched as an object". Хотя если в файле bitrix/modules/main/lib/orm/query/result.php в методе initializeFetchObject закомментировать проверку на наличие в запросе агрегирующих полей [if (!empty($this->query->getGroupChains()))] и ExpressionField'у задать тип ArrayField, то в результате fetchObject прекрасно возвращается поле содержащее массив значений.
Идея: разрешить использование агрегирующих полей, либо доработать АПИ так, чтоб можно было получать нечто подобное без лишних запросов.
Рейтинг: 7.7074  
Новая
Предложил serginhold 04.09.2017 22:41:05

DataManager::getList разделить на два метода для возможности нормального наследования и расширения

В связи с тем что внутри метода getList создается новый Query и в итоге возвращается готовый sql запрос, есть невероятная проблема расширения параметров при наследовании DataManager.

Мне вот для sphinx потребовался новый параметр 'match', и чтобы мне туда его засунуть, мне нужно полностью переписать метод getList, т.е. скопипастить все что есть в исходниках этого метода и где-то в серединку добавить 'match'. А должно быть как-то так:

public static function getList(array $parameters = [])
{
    $query = parent::getList($parameters);

    if (isset($parameters['match']))
    {
        $query->setMatch($parameters['match']);
    }

    return $query;
}


С учетом того что эта функция должна возвращать Result, а не Query, нужно добавить внутри хотя бы один метод, вместо кучи кода обработки параметров, т.е. сделать хотя бы так:

public static function getList(array $parameters = [])
{
     return static::buildQuery($parameters)->exec();
}

public/*protected?*/ static function buildQuery(array $parameters = [])
{
    $query = static::query();
    // тут текущий код
    return $query;
}


Тогда в метод buildQuery можно будет без проблем добавить любой новый параметр.

А в данный момент нужно именно копипастить код, да и еще в 17 версии появился ключ 'cache', и вот допустим у меня старая версия ядра, и если мне нужен этот ключ 'cache' в моем DataManager для sphinx, уже после обновления, то мне надо опять скопипастить новые исходники.
Рейтинг: 6.3456  
Новая
Предложил Жиряков Дмитрий 11.05.2017 14:10:22

Добавлять NOT NULL только к полям с атрибутом "required"=true

Вся соль в том, что сейчас в методе compileDbTableStructureDump() ORM-сущностей "хардкодом" прописано добавление атрибута NOT NULL всем создаваемым полям.
Рейтинг: 16.5172  
Новая
Предложил Николаев Андрей 09.01.2017 11:41:05

D7 ORM - ON DELETE CASCADE

Идея, которую хотелось бы тут изложить, не нова, но руки никак до нее не доходили.
Навеяна она сообщением на форуме: http://dev.1c-bitrix.ru/community/forums/forum6/topic92353/

В sql есть "каскадные операции" - удаление связанных записей или обновлние.
И хотя сейчас я слабо представляю каскадное обновление, но вот каскадное удаление или запрет на изменение/удаление уже отчетливо видно.
Прошу рассмотреть возможность реализации данной функциональности.
Рейтинг: 2.2596  
На голосовании
Предложил Жиряков Дмитрий 03.06.2016 14:45:15

Добавить возможность выбора всех пользовательских полей ORM-сущности в getList

Сейчас нужно перечислять все поля в секции 'select':
$query->addSelect(array('*', 'UF_FILE', 'UF_SAMPLE', ....));

Было бы удобнее делать как-то так:
$query->addSelect(array('*', 'UF_*'));
Рейтинг: 8.7871  
Новая
Предложил Масленников Андрей 14.03.2016 13:16:11

MySQL 5.7 + JSON + ORM

Добрый день.

Хотелось бы "из коробки" получить возможность составлять SQL запросы для полей типа JSON в MySQL 5.7
По аналогии с https://habrahabr.ru/post/278935/
Рейтинг: 6.8511  
На голосовании
Предложил Shkapov Artem 27.01.2015 10:21:41

Портировать ORM под postgresql

Предлагаю сделать порт ОРМ для работы с postgresql.

Тестировал работу django + postgresql c миллионом записей в 1 таблице, сайт летает без кеша. Думаю битриксу не помешает. Кроме того в версии 9.4 появиться jsonb, можно будет создавать универсальные списки без лишних таблиц.  
Рейтинг: 9.3132  
На голосовании
Предложил Шкарупа Алексей 24.12.2014 00:43:39

Больше DDL в ORM: синхронизация изменений модели в таблицу БД

ORM это хорошо. Он призван избавить разработчика от написания SQL.
Так вот если с DML сейчас все как-то более-менее устаканилось, то в DML еще можно многое улучшить.

Вот мы с Вами выпускаем решения в маркетплейс, описываем table-сущности. А таблички в БД как создаем? Через выполнение SQL из файла install.sql в модуле. А кто позвольте спросить пишет все 3 install.sql - под Oracle, MS Sql, MySql - предположу что никто.

А в ORM уже между прочим есть такая вот возможность:
\Intervolga\MyModule\MyTable::getEntity()->createDbTable();
При выполнении данного кода будет прочитано все что вы написали в методе getMap, сгенерирован SQL под текущую базу данных, создана табличка в БД. с нужными полями.

Есть также много отдельных полезных методов у Application::getConnection(): проверка наличия/создание индексов например.

Вот только для нормальной разработки этого мало. Чтобы это по-настоящему заработало сейчас очень не хватает (лично мне) нескольких вещей:
  1. Возможности при описании полей Table-класса указать что на конкретное поле нужно поставить индекс (естественно я хочу чтобы упомянутый выше метод createDbTable этот признак понимал)
  2. Одного мега-метода который приведен таблицу БД в соответствие с описанием сущности (создаст таблицу если ее нет, удалит лишние поля, создаст недостающие, изменит параметры поля - varchar(10) -> varchar(20), проверит все ли индексы созданы).
Представьте насколько проще будет делать модули с 5-10 таблицами. А уж насколько проще будет делать обновления затрагивающие структуру таблиц я вообще молчу (а вы вспоминаете про 3 базы данных...).
Рейтинг: 1.0978  
Внедрено
Предложил James Gerat 16.09.2014 19:15:21

Подсчет строк в D7

/bitrix\modules\main\lib\entity\query.php:1342

/*
Vadim: this is for paging but currently is not used
      if ($this->count_total || !is_null($this->offset))
      {
         $cnt_body_elements = $build_parts;

         // remove order
         unset($cnt_body_elements['ORDER BY']);

         $cnt_query = join("\n", $cnt_body_elements);

         // remove long aliases
         list($cnt_query, ) = $this->replaceSelectAliases($cnt_query);

         // sel ect count
         $cnt_query = 'SELECT COUNT(1) AS TMP_ROWS_CNT FR OM ('.$cnt_query.') xxx';
         $cnt = $connection->queryScalar($cnt_query);
      }
*/ 
Уважаемый Вадим!!
К сожалению, это не используется только потому это не сделано. У нас большой проект на орме уже работает, вышло пару десятков обновлений, но до сих пор вы почему то считаете, что это ни кому ни нужно.
Подпираем костылями как можем, но очень вас просим включить функционал подсчета строк как можно быстрее. Или укажите когда примерно стоит ожидать.
Рейтинг: 0.219  
Ответил 19.09.2014 15:33:53
Спасибо вам за идею. Мы берем ее в работу.

Будем рады за любые идеи по развитию нового ядра.
Рейтинг: 55.2055  
На голосовании
Предложил Шкарупа Алексей 08.07.2014 16:08:39

Массовые Update и Delete в ORM

В настоящий момент ORM поддерживает только Update/Delete по первичному ключу.

В результате если вам нужно удалить 10000 из 1 миллиона при определенном условии приходится или писать говнокод (перебор в цикле, а при указанных объемах это уже пошаговый процесс) или писать говнокод (sql-запрос ручками с поддержкой 3х баз даных).

В общем даешь методы bulkUpdate и bulkDelete которые смогут:
а) обновлять/удалять записи по условиям а не по ключам
б) смогут использовать в запросах свои же поля (например, увеличить значение целочисленного поля НА 1, т.е. SET x = x + 1)
Рейтинг: 10.8059  
Новая
Предложил Валерий Чебан 19.05.2014 12:58:53

Обернуть генератор ORM в один метод (функцию), чтобы его можно было использовать

Сейчас это сплошной код на странице админки /bitrix/admin/perfmon_tables.php?lang=ru&orm=y :



А должен быть удобный для использования метод вида:
string function getOrmClassFromTable(string $tableName);
Рейтинг: 12.1007  
Новая
Предложил Ерофеев Анатолий 14.04.2014 14:19:57

Компоненты для ORM, админка для ORM

Коллеги!

Вы внедрили замечательный механизм ORM, благодаря которому создавать свои сущности стало очень просто (с точки зрения программиста). Но раз вы разработали "стандарт" ORM для Битрикса, может, сделаете и набор стандартных компонентов для работы с ним (список записей, страница записи, добавление записи)? В том числе и стандартные страницы для админки со списком записей, фильтром, страницей редактирования записи.
Рейтинг: 3.9352  
На голосовании
Предложил Морковкин Никита 12.12.2013 13:55:10

Реализовать выбор DbConnection для {Model}Table

Кратко:
Сейчас ORM можно использовать только для соединения default

Полно:
Если заглянуть в Bitrix\Main\Entity\DataManager,
можно найти функцию getConnectionName

Переопределение в дочернем классе этой функции не дает желаемого результата!
Все равно используется соединение default

В коде Bitrix\Main\Entity\Query (возможно ещё где-то) можно встретить такую конструкцию:
\Bitrix\Main\Application::getConnection()
Явно видно что не используется название соединения из класса {Model}Table а хотелось бы
Рейтинг: 52.5453  
В работе
Предложил Валерий Чебан 28.11.2013 21:29:00

Сборная солянка "хотелок" по highloadblock, первая пачка

Частично уже были в некоторых идеях. Но тут о highloadblock в общем, это все нужно в реальных проектах уже сегодня:

1/ Пользовательское свойство "Html/text" с визуальным редактором.
Нужно для полей в highloadblock

уже есть идея:
http://idea.1c-bitrix.ru/add-custom-field-htmltext/

2/ Пользовательское свойство "привязка к highloadblock".
Нужно для организации связей highloadblock между собой.

3/ свойство в обычных инфоблоках "привязка к highloadblock".
Чтобы справочники для товаров на инфоблоках хранить на highloadblock
(зачем справочникам быть тоже на инфоблоках?)

4/ фильтр в списке элементов highloadblock
если там будет статистика какая-нибудь, то как без фильтра?

5/ настраиваемый список элементов в highloadblock,
чтобы убирать ненужные в лентах колонки

6/ множественные свойства в highloadblock
этот вот пункт мне совершенно не критичен. Если будет привязка highloadblock друг к другу, то можно запросто организовать хранение множественных значений как отдельной сущности.
Рейтинг: 0.5065  
Ответил Жуков Евгений 29.11.2013 13:11:09
Свойство Справочник выпущено. Это п.3
Рейтинг: 0.3402  
Ответил Жуков Евгений 25.08.2014 18:50:12
2/ Пользовательское свойство "привязка к highloadblock".
Вышло в обновлении highloadblock 14.5.1
Рейтинг: 13.1395  
На голосовании
Предложил Зайцев Артемий 16.02.2013 11:48:38

Универсальный импорт-экспорт XML в ORM

Рыжиков на конференции обещал, что вот-вот начнется обсуждение D7. Предлагайте свои идеи и. т. .п.

Итак, я хочу универсальный импорт-экспорт в ORM. Хочу, чтобы это заложили на уровне ядра.

Разрабатывая сайт на локальной машине постоянно хочется какие-то данные из локальной базы данных перенести на боевой сервер.

Создал свойство инфоблока - выгрузил на боевой сайт. Изменил опцию - выгрузил на боевой сайт.

В 1С есть интересный механизм:
там каждый объект (справочник, свойство, значение свойства)  имеет уникальный не повторяющийся GUID:  cbcf498f-55bc-11d9-848a-00112f43529a

Мы их видим, когда выгружается справочник товаров в инфоблок.

GUID представляет собой уникальную ссылку на объект.

GUID'ы в разных базах уникальные. Маловероятно, что где-то создаются одинаковые. Это их главное отличие от ID


Каждый объект умеет записываться в XML, каждый объект может быть записан и прочитан в любой 1С.

В 1С реализовано надежное взаимодействие разных информационных баз друг с другом: Бухгалтерии и Управлении торговлей.

Что надо сделать:
- таблица уникальных гуидов. Таблица заполняется автоматически, когда создается новый элемент или новая таблица
IDTABLE_NAMEELEMENT_IDGUIDID_FROM_ANOTHER_DATABASE
1b_option
1
cbcf498f-55bc-11d9-
848a-00112f43529a
2b_hiload_products
1
aabb4983-55bc-11d9-
848a-00112f43529a
0000123
- для каждого объекта базы данных возможность выгрузить в XML
Элемент = Сущность::GetByID();
$str = Элемент->ВыгрузитьВXML(  );


Или короче:

$str = GetXML(  $GUID );


- для каждого объекта базы данных возможность создать или изменить из XML.
Элемент = new КлассСущности;
Элемент->ЗаписатьИзXML( $str );


Или короче

$GUID = WriteXML( $str );

- маленькую форму "выгрузить объект по ссылке" :
в форме ввести cbcf498f-55bc-11d9-848a-00112f43529a и получить обект в XML. А еще лучше срaзу отправить на боевой сервер и там записать.

объект может быть простым (цена товара или опция)
или составным (товар с ценами или таблица опций)

Также можно будет выгружать и загружать товар, списки товаров, списки заказов, списки опций. Вcе у чего есть GUID.