@Snatch87
Битриксоид по принуждению

Как избежать неправильной типизации данных при работе с ORM?

Всем привет.

При работе с ORM и объектом query возникает небольшая (точнее очень большая) неприятность: все поля становятся типа string, хотя в сущности описаны с правильными данными. Пример:

$select = [
            '*',
            'IMG_' => 'IMG',
            'SECTION.ID', 
        ];

        $query = Sale\Internals\BasketTable::query()
            
            ->registerRuntimeField('SECTION', array(
                'data_type' => \Bitrix\Iblock\SectionTable::class,
                'reference' => [
                    '=this.PRODUCT.IBLOCK_SECTION_ID' => 'ref.ID'
                ]
            ))
            ->registerRuntimeField('IMG', [
                'data_type' => \Bitrix\Main\FileTable::class,
                'reference' => [
                    '=this.PRODUCT.PREVIEW_PICTURE' => 'ref.ID',
                ]
            ])
            ->setSelect($select)
            ->where('FUSER_ID', $this->fuser)
            ->where('ORDER_ID', null)

        ;

        $rsBasketItems = $query->exec();

        while($basketItem = $rsBasketItems->fetch()){
        }


Если сделать dump basketItem, то все поля будут типа string
Если использовать fetchObject то внутри данные имеют правильную типизацию, но мне не нравится с ними работать, т.к. получаются очень тяжелые объекты. Ну и очень не удобно обращаться к каждому полю, как $basketItem->get('field') . + z использую собственные модели, в которых произвожу все преобразования, и их вывожу в шаблоне.

Как вариант, ещё можно использовать addFetchDataModifier и там преобразовывать нужные поля, но это тоже не очень удобно.

Кто сталкивался, как решали?
  • Вопрос задан
  • 42 просмотра
Пригласить эксперта
Ответы на вопрос 1
gromdron
@gromdron
Bitrix developer
Если сделать dump basketItem, то все поля будут типа string


Правильно. Это ограничение вызванное не bitrix framework, а драйвером для работы с СУБД. В базе храняться реальные значения, а вот mysqli возвращает string-результаты.
Т.е. в битрикс они такими уже приходят из СУБД.

Объекты эту проблему решают приводя результаты к нужным типами, а raw-значения так и остаются string'ами.

Если хотите, то можете в $rsBasketItems->fetch() передать класс-наследника \Bitrix\Main\Text\Converter и его может encode будет применен к каждому значению и вы получите сразу нужные вам поля, но если сделать это нужно в одном месте, то проще будет конечно же в цикле пробежаться и привести самостоятельно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
10 дек. 2019, в 15:58
10000 руб./за проект
10 дек. 2019, в 15:37
200 руб./за проект
10 дек. 2019, в 15:30
25000 руб./за проект