Активно используем модуль и своих таблиц с для решения задач.
Нам при работе с построителем запросов Bitrix\Main\Entity\Query не хватает:
1/ Мануал по использованию метода registerRuntimeField(), в частности по настройке типов полей $fieldInfo
2/ Примеры решения через построитель запросов
3/ можно ли получить сформированный SQL в построителе запросов без предварительного исполнения запроса?
Делюсь недавней находкой, как решить следующую задачу:
Необходимо выбрать из таблицы элементов инфоблока 1.0 элементы, отсортированные по значению свойства, заданного кодом.
Решение будет следующим, выбираем из таблицы b_iblock_element элементы инфоблока, а также к таблице джойним таблицу b_iblock_element_property со всеми свойствами, однако фильтруем именно нужное нам с кодом 30:
Итого мы получаем следующую картинку:
дамп итогового запроса:
дамп одного элемента итерации, как видите все поля таблицы свойств b_iblock_element_property заджойнились, но мы выбрали только нужное нам свойство и успешно по нему выполнили сортировку:
Также мы добавили следующее событие, чтобы не дописывать в урле orm=y для запуска :
/bitrix/php_interface/include/lib/handlers.php:
Итог:
1/ Хотим документацию по построителю запросов, а еще больше по примерам решаемых задач.
2/ Очень хотим \Bitrix\Iblock\ElementPropertyTable и прочие сущности из коробки, которые часто используются в проектах
3/ Хотим диаграмму классов по D7!
Нам при работе с построителем запросов Bitrix\Main\Entity\Query не хватает:
1/ Мануал по использованию метода registerRuntimeField(), в частности по настройке типов полей $fieldInfo
2/ Примеры решения через построитель запросов
3/ можно ли получить сформированный SQL в построителе запросов без предварительного исполнения запроса?
Делюсь недавней находкой, как решить следующую задачу:
Необходимо выбрать из таблицы элементов инфоблока 1.0 элементы, отсортированные по значению свойства, заданного кодом.
Решение будет следующим, выбираем из таблицы b_iblock_element элементы инфоблока, а также к таблице джойним таблицу b_iblock_element_property со всеми свойствами, однако фильтруем именно нужное нам с кодом 30:
// дамп запроса на быструю руку
$showLastQuery = function ($queryBuilder) {
echo '<h4>' . wordwrap($queryBuilder->getLastQuery(), 150) . "</h4>\n\n";
};
// инфоблок 1.0. Выбираем элемент и одно свойство, по нему делаем сортировку.
// алиас поля делаем DOC_ID
use Bitrix\Iblock as ib;
use Bitrix\Main as bm;
$propertySelectAndSortId = 30;
$propertyFieldName = 'DOC_ID';
$queryBuilder = new bm\Entity\Query( ib\ElementTable::getEntity() );
$elC = $queryBuilder
->setSelect( array('NAME', 'ID', 'IBLOCK_ID', $propertyFieldName) )
->registerRuntimeField($propertyFieldName, array(
"data_type" => '\Bitrix\Iblock\ElementPropertyTable',
'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'),
))
->setFilter(array(
'IBLOCK_ID' => 10,
'IBLOCK_ELEMENT_' . $propertyFieldName . '_IBLOCK_PROPERTY_ID'
=> $propertySelectAndSortId
))
->setOrder( array('IBLOCK_ELEMENT_' . $propertyFieldName . '_VALUE' => 'ASC') )
->exec()->fetchAll();
$showLastQuery( $queryBuilder );
echo count($elC);
xdebug_var_dump($elC); |
дамп итогового запроса:
SEL ECT `iblock_element`.`NAME` AS `NAME`, `iblock_element`.`ID` AS `ID`, `iblock_element`.`IBLOCK_ID` AS `IBLOCK_ID`, `iblock_element_doc_id`.`ID` AS `IBLOCK_ELEMENT_DOC_ID_ID`, `iblock_element_doc_id`.`IBLOCK_PROPERTY_ID` AS `IBLOCK_ELEMENT_DOC_ID_IBLOCK_PROPERTY_ID`, `iblock_element_doc_id`.`IBLOCK_ELEMENT_ID` AS `IBLOCK_ELEMENT_DOC_ID_IBLOCK_ELEMENT_ID`, `iblock_element_doc_id`.`VALUE` AS `IBLOCK_ELEMENT_DOC_ID_VALUE`, `iblock_element_doc_id`.`VALUE_TYPE` AS `IBLOCK_ELEMENT_DOC_ID_VALUE_TYPE`, `iblock_element_doc_id`.`VALUE_ENUM` AS `IBLOCK_ELEMENT_DOC_ID_VALUE_ENUM`, `iblock_element_doc_id`.`VALUE_NUM` AS `IBLOCK_ELEMENT_DOC_ID_VALUE_NUM`, `iblock_element_doc_id`.`DESCRIPTION` AS `IBLOCK_ELEMENT_DOC_ID_DESCRIPTION` FR OM `b_iblock_element` `iblock_element` LEFT JOIN `b_iblock_element_property` `iblock_element_doc_id` ON `iblock_element`.`ID` = `iblock_element_doc_id`.`IBLOCK_ELEMENT_ID` WHERE `iblock_element`.`IBLOCK_ID` = 10 AND `iblock_element_doc_id`.`IBLOCK_PROPERTY_ID` = 30 ORDER BY `iblock_element_doc_id`.`VALUE` ASC |
array(101) {
[0]=>
array(11) {
["NAME"]=>
string(89) "БТ22 Организация защиты от закладочных устройств"
["ID"]=>
string(3) "909"
["IBLOCK_ID"]=>
string(2) "10"
["IBLOCK_ELEMENT_DOC_ID_ID"]=>
string(6) "196316"
["IBLOCK_ELEMENT_DOC_ID_IBLOCK_PROPERTY_ID"]=>
string(2) "30"
["IBLOCK_ELEMENT_DOC_ID_IBLOCK_ELEMENT_ID"]=>
string(3) "909"
["IBLOCK_ELEMENT_DOC_ID_VALUE"]=>
string(19) "5806196164056982304"
["IBLOCK_ELEMENT_DOC_ID_VALUE_TYPE"]=>
string(4) "text"
["IBLOCK_ELEMENT_DOC_ID_VALUE_ENUM"]=>
string(10) "2147483647"
["IBLOCK_ELEMENT_DOC_ID_VALUE_NUM"]=>
string(19) "58061961640569.0000"
["IBLOCK_ELEMENT_DOC_ID_DESCRIPTION"]=>
NULL
}
// ....
|
/bitrix/php_interface/include/lib/handlers.php:
AddEventHandler('main', 'OnBeforeProlog', function () {
global $APPLICATION;
if ($APPLICATION->GetCurPage() == '/bitrix/admin/perfmon_tables.php' && $_GET['orm'] != 'y') {
LocalRedirect( $APPLICATION->GetCurPageParam("orm=y") );
}
}); |
1/ Хотим документацию по построителю запросов, а еще больше по примерам решаемых задач.
2/ Очень хотим \Bitrix\Iblock\ElementPropertyTable и прочие сущности из коробки, которые часто используются в проектах
3/ Хотим диаграмму классов по D7!
