• Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @d6core Автор вопроса
    Ну вообще я с вами согласен) Просто NDA боюсь, вот и фрукты. Вот эта конструкция смутила, \Bitrix\Iblock\Iblock::wakeUp. Просто хочется понять, как пользоваться в битриксе БД полноценно, как если бы я юзал чистый sql. Когда читаю документацию, немного впадаю в ступор. Вот допустим в laravel ORM один, в yii другой, в symfony 3-й. Но как то там понятнее, чем тут.
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @d6core Автор вопроса
    new ExpressionField('FROM_NAME', 'COUNT(%s)', 'A.NAME'),
    new ExpressionField('TO_NAME', 'COUNT(%s)', 'B.NAME'),


    Вот так у меня не получилось, получилось так, по сути, как вы и говорили. Большое спасибо)

    use Bitrix\Main\ORM\Fields\Relations\Reference;
    use Bitrix\Main\ORM\Query\Join;
    use Bitrix\Main\Entity\ExpressionField;
    
    CModule::IncludeModule('iblock');
    
    //история транзакций
    $authorsIblock = \Bitrix\Iblock\Iblock::wakeUp(2);
    //счета
    $refIb = \Bitrix\Iblock\Iblock::wakeUp(1);
    
    $res = $authorsIblock->getEntityDataClass()::getList([
        'select' => [
            'ACCOUNT_FROM_VALUE' => 'ACCOUNT_FROM.VALUE', 'ACCOUNT_TO_VALUE' => 'ACCOUNT_TO.VALUE',
            'FROM_NAME' => 'A.NAME', 'TO_NAME' => 'B.NAME',
            'COUNT',
        ],
        'filter' => ['>DATE_CREATE'=> ConvertTimeStamp(AddToTimeStamp(array('HH' => -6)), 'FULL')],
        'runtime' => [
            new Reference(
                'A',
                $refIb->getEntityDataClass(),
                Join::on('this.ACCOUNT_FROM_VALUE', 'ref.ID')
            ),
            new Reference(
                'B',
                $refIb->getEntityDataClass(),
                Join::on('this.ACCOUNT_TO_VALUE', 'ref.ID')
            ),
            new ExpressionField('COUNT', 'COUNT(*)'),
        ]
    ])->fetchAll();


    А в продакшене такие запросы годятся? Такой код
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @d6core Автор вопроса
    d6core, не, я забыл поставить знак больше) >DATE_CREATE
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @d6core Автор вопроса
    PetrPo, вчера читал) Не понимаю, когда я пишу прямой запрос, все работает.
    Мне нужно сгруппировать записи по 2-м полям, FROM_ACCOUNT и TO_ACCOUNT и посчитать их.

    //Вот я указываю поля, по которым нужно группировать
    'group' => ['FROM_NAME', 'TO_NAME'],
    //считаю сгруппированные поля
    new \Bitrix\Main\Entity\ExpressionField('COUNT', 'COUNT(*)'),


    Можете показать плз, что вы имеете в виду?)

    Фильтр не работает потому что передаешь дату не в формате БД

    Через гетлист старого ядра такой вариант работал
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @d6core Автор вопроса
    PetrPo, вот пытался по вашему примеру сделать выборку из 2-х обычных ИБ.
    Почему то не работает группировка и фильтр по дате(

    X9ZfY1m.png

    Для примера, сделал 2 таблицы.

    История транзакций и Счета.
    Я пытаюсь получить записи за последние 6 часов к примеру.
    Без фильтра возвращаются все записи(не сработала группировка),
    а с фильтром ничего не возвращает.

    Желаемый результат на скрине.

    use Bitrix\Main\ORM\Fields\Relations\Reference;
    use Bitrix\Main\ORM\Query\Join;
    
    CModule::IncludeModule('iblock');
    
    //история транзакций
    $authorsIblock = \Bitrix\Iblock\Iblock::wakeUp(2);
    //счета
    $refIb = \Bitrix\Iblock\Iblock::wakeUp(1);
    
    $res = $authorsIblock->getEntityDataClass()::getList([
        'order' => ['DATE_CREATE'=>'DESC'],
        'select' => [
            'ID', 'NAME', 'ACCOUNT_FROM_VALUE' => 'ACCOUNT_FROM.VALUE', 'ACCOUNT_TO_VALUE' => 'ACCOUNT_TO.VALUE',
            'FROM_NAME' => 'A.NAME', 'TO_NAME' => 'B.NAME',
            'COUNT',
        ],
        'filter' => ['DATE_CREATE'=> ConvertTimeStamp(AddToTimeStamp(array('HH' => -6)), 'FULL')],
        'group' => ['FROM_NAME', 'TO_NAME'],
        'runtime' => [
            new Reference(
                'A',
                $refIb->getEntityDataClass(),
                Join::on('this.ACCOUNT_FROM_VALUE', 'ref.ID')
            ),
            new Reference(
                'B',
                $refIb->getEntityDataClass(),
                Join::on('this.ACCOUNT_TO_VALUE', 'ref.ID')
            ),
            new \Bitrix\Main\Entity\ExpressionField('COUNT', 'COUNT(*)'),
        ]
    ])->fetchAll();
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @d6core Автор вопроса
    PetrPo, да, примерно, а можно чтобы в результате были не ID, а NAME? Или без доп. запросов не обойтись?
    KwP01pd.png