Он и возвращается только строкой, т.к. это результат запроса, вроде как data_type для того и есть, чтобы привести к нужному типу. Но чет похоже битрикс против.
Битрикс хочет, чтобы вы джойнили )) По типу массив: примеры того, как ОРМ предполагает использование типа массив при работе через Query $entity->addField( (new ArrayField($fieldName)) ->configureSerializationPhp(), $fieldName ); ...или $entity->addField( (new ArrayField($fieldName)) ->configureSerializationJson(), $fieldName ); То есть мы читаем из базы строку — либо сериализованный либо обджосоненый массив, но на выходе из fetch-а получаем реально массив.
Спасибо за разъяснение. Самое интересное, что orm массивы не сериализует без явного указания, а хранит их в поле БД как [1,2,3]. Если сделать update(1, 'field_array' => [1,2,3]), то все начинает работать. А чтобы отличить их от текста он к добавляет кавычки в поле БД "[1,2,3]“
Не только массивам. https://t.me/bitrixfordevelopers/378253
А у меня DateTime выгрузились классами, все норм
А у меня Date. С DateTime я ж написал, что всё ок ))
Точно, не понял сразу что о типе речь раз по русски написано
Спасибо про массивы пригодилось. А вы ими пользовались? Там на стороне БД создается поле varchar(255), т.е. малопригодное свойство вышло. Я пока после $entity->createDbTable(); Вставил ALTER TABLE $tableName MODIFY $tableName.$fieldName LONGTEXT; Как понимаю правильно будет создать свой ArrayField. Не подскажете как поменять базовый тип данных на стороне MySQL? Я так и не нашел где оно там в ORM вызывается.
Я туда настройки сохраняю (типа color: #554466, type: dyno_egg, status: embrion...) или мульти-привязку, например массив кодов элементов. >>> Как понимаю правильно будет создать свой ArrayField === Меня устраивает то, что в БД строка а из кода я оперирую массивом
Меня все устраивает, кроме длины в 255 символов :) Как бы вы обошли эту проблему без прямой замены типа поля в БД?
...а у вас какие варианты? )) Судя по бекграунду у вас богаче опыт работы напрямую с БД
Я заменил напрямую. Интересно как это сделать используя ORM битрикса.
Ага. Вопрос не альтернативы Альтеру а его аналога. Гляньте вот этот метод, может то что нужно
да я смотрел реализации встроенных типов. Но я так и не нашел где ж он это свойство применяет. А мне в идеале надо вообще от string избавится в пользу longtext
Если не делали, то я сам поковыряюсь, думал может уже была задача. Удобно серилизовать целиком результаты запросов getList для переноса
\Bitrix\Main\DB\MysqlCommonSqlHelper::getColumnTypeByField return 'int'; return 'double'; return 'datetime'; return 'date'; return 'text'; return 'varchar('.max(strlen($values[0]), strlen($values[1])).')'; return 'varchar('.max(array_map('strlen', $field->getValues())).')'; return 'varchar('.($defaultLength > 0? $defaultLength: 255).')';
понял спасибо. Вижу всё тупо захардокодили в varchar. Беда, ну ладно буду патчить БД. А как выделять код в телеграмме?
Выделяем, правой клавишей мыши / Formatting — там и клавиатурные сокращения
Я попробовал бы отнаследоваться от СкалярФиелда и переопределить метод.
я тоже так хотел, но там база у него varchar. Там похоже без шансов судя по этому методу: \Bitrix\Main\DB\MysqlCommonSqlHelper::getColumnTypeByField
я как то просто скопировал класс ArrayField себе в неймспейс, и унаследовал его от TextField. больше ничего не менял, вроде
Там 65535 вроде крышка, мне иногда мало для здоровых вложенных массивов.
можно сделать свой db connection и допилить) или обойтись без орм
без ORM я обошелся :) Судя по тому что я вижу в исходниках - ORM захардкодили. Вместо того, чтобы дать по ветке else, если тип нестандартный определение своего типа, они хардкодят varchar
тебе бы пришлось делать хелперы для каждой субд, которую они поддерживают
немного иначе. им пришлось бы дать тебе такую возможность)
Я бы в этой функции \Bitrix\Main\DB\MysqlCommonSqlHelper::getColumnTypeByField по последней ветке, когда тип не определен, то добавил бы еще одну ветку elseif (isset($field->customDBType) { // return 'varchar('.($defaultLength > 0? $defaultLength: 255).')'; ...... return $field->customDBType . $field->size ? '(' . $field->size . ')' : ''; }
так это хелпер только для mysql. а вот вижу, есть еще для mssql, oracle...
Я просто для примера показал что не так уж и сложно было сделать поддержку кастомного типа поля
не так уж сложно "наговнокодить" поддержку. а сделать, что бы потом мы не ругались в паблике ядра - сложнее)
Вон даже Гугл лег по такому случаю )
Обсуждают сегодня