Всем добрый день!
Изучаю работу ядра d7 и заинтересовал момент про runtime-поля.
Хочу сделать запрос на извлчение полей из 2-х таблиц.
Есть Highload-блок "Голоса". В нём есть 3 поля: ID, UF_ELEMENT_ID, UF_IP_ADDRESS, UF_DATE
Есть также другой Highload-блок "Посты". В нём поля: ID, UF_NAME
Нужно составить такой запрос, который бы извлекал данные из Highload-блока "Голоса", но добавлял бы к этим данным поле UF_NAME из Highload-блока "Посты".
Связь по полю Голоса.UF_ELEMENT_ID=Посты.ID
На SQL написать не сложно, но интересно, как это делается используя runtime-поля в запросах вида
$dbItems = \Bitrix\Highloadblock\HighloadBlockTable::getList
Та документация что есть - очень плохая. Не понятно, что именно нужно передавать в параметр runtime. Само описание метода getList взял отсюда:
Классы для каждого Highload-блока сгенерировал из админки. Вот они:
Для Highload-блока "Посты":
Для Highload-блока "Голоса":
Запрос пытаюсь составить вот так:
Только вот почему то в $elements ничего не попадает. Сами данные в Highload-блоках есть. Подскажите пожалуйста, как правильно составить запрос, чтобы всё работало. Скриншоты прикрепил.
Изучаю работу ядра d7 и заинтересовал момент про runtime-поля.
Хочу сделать запрос на извлчение полей из 2-х таблиц.
Есть Highload-блок "Голоса". В нём есть 3 поля: ID, UF_ELEMENT_ID, UF_IP_ADDRESS, UF_DATE
Есть также другой Highload-блок "Посты". В нём поля: ID, UF_NAME
Нужно составить такой запрос, который бы извлекал данные из Highload-блока "Голоса", но добавлял бы к этим данным поле UF_NAME из Highload-блока "Посты".
Связь по полю Голоса.UF_ELEMENT_ID=Посты.ID
На SQL написать не сложно, но интересно, как это делается используя runtime-поля в запросах вида
$dbItems = \Bitrix\Highloadblock\HighloadBlockTable::getList
Та документация что есть - очень плохая. Не понятно, что именно нужно передавать в параметр runtime. Само описание метода getList взял отсюда:
Классы для каждого Highload-блока сгенерировал из админки. Вот они:
Для Highload-блока "Посты":
| Код |
|---|
namespace Bitrix;
use Bitrix\Main\Localization\Loc,
Bitrix\Main\ORM\Data\DataManager,
Bitrix\Main\ORM\Fields\IntegerField,
Bitrix\Main\ORM\Fields\TextField;
Loc::loadMessages(__FILE__);
/**
* Class Posts
*
* Fields:
* <ul>
* <li> ID int mandatory
* <li> UF_NAME text optional
* </ul>
*
* @package Bitrix\
**/
class Posts extends DataManager
{
/**
* Returns DB table name for entity.
*
* @return string
*/
public static function getTableName()
{
return 'posts';
}
/**
* Returns entity map definition.
*
* @return array
*/
public static function getMap()
{
return [
new IntegerField(
'ID',
[
'primary' => true,
'autocomplete' => true,
'title' => Loc::getMessage('_ENTITY_ID_FIELD')
]
),
new TextField(
'UF_NAME',
[
'title' => Loc::getMessage('_ENTITY_UF_NAME_FIELD')
]
),
];
}
} |
Для Highload-блока "Голоса":
| Код |
|---|
namespace Bitrix;
use Bitrix\Main\Localization\Loc,
Bitrix\Main\ORM\Data\DataManager,
Bitrix\Main\ORM\Fields\DatetimeField,
Bitrix\Main\ORM\Fields\FloatField,
Bitrix\Main\ORM\Fields\IntegerField,
Bitrix\Main\ORM\Fields\TextField;
Loc::loadMessages(__FILE__);
/**
* Class Voices
*
* Fields:
* <ul>
* <li> ID int mandatory
* <li> UF_ELEMENT_ID double optional
* <li> UF_IP_ADDRESS text optional
* <li> UF_DATE datetime optional
* </ul>
*
* @package Bitrix\
**/
class Voices extends DataManager
{
/**
* Returns DB table name for entity.
*
* @return string
*/
public static function getTableName()
{
return 'voices';
}
/**
* Returns entity map definition.
*
* @return array
*/
public static function getMap()
{
return [
new IntegerField(
'ID',
[
'primary' => true,
'autocomplete' => true,
'title' => Loc::getMessage('_ENTITY_ID_FIELD')
]
),
new FloatField(
'UF_ELEMENT_ID',
[
'title' => Loc::getMessage('_ENTITY_UF_ELEMENT_ID_FIELD')
]
),
new TextField(
'UF_IP_ADDRESS',
[
'title' => Loc::getMessage('_ENTITY_UF_IP_ADDRESS_FIELD')
]
),
new DatetimeField(
'UF_DATE',
[
'title' => Loc::getMessage('_ENTITY_UF_DATE_FIELD')
]
),
];
}
} |
Запрос пытаюсь составить вот так:
| Код |
|---|
$voicesHLBlockId = 20;//Voices
$voicesHLblock = HL\HighloadBlockTable::getById($voicesHLBlockId)->fetch();
$voices = HL\HighloadBlockTable::compileEntity($voicesHLblock);
$voicesDataClass = $voices->getDataClass();//\VoicesTable
$postsHLBlockId = 19;//Posts
$postsHLblock = HL\HighloadBlockTable::getById($postsHLBlockId)->fetch();
$posts = HL\HighloadBlockTable::compileEntity($postsHLblock);
$postsDataClass = $posts->getDataClass();//\PostsTable
$rsData = $voicesDataClass::getList([
"select" => ["UF_ELEMENT_ID", "UF_IP_ADDRESS", "UF_DATE"],
"filter" => ["UF_ELEMENT_ID" => "POSTS.ID"],
'runtime' => [
new Entity\ReferenceField(
"POSTS",
\PostsTable::class,
Query\Join::on('this.UF_ELEMENT_ID', 'ref.ID')
)
]
]);
$elements['ITEMS'] = [];
while ($arData = $rsData->Fetch()) {
$elements['ITEMS'][] = $arData;
}
echo '<pre>';
var_dump($elements);
echo '</pre>'; |
Только вот почему то в $elements ничего не попадает. Сами данные в Highload-блоках есть. Подскажите пожалуйста, как правильно составить запрос, чтобы всё работало. Скриншоты прикрепил.