Для реализации связи нескольких таблиц с использованием ORM Bitrix вы можете воспользоваться методом getList() или методом Query() в зависимости от ваших потребностей.
Метод getList() позволяет получить данные из одной таблицы на основе фильтрации, сортировки и других условий. Однако, он сам по себе не поддерживает работу с несколькими таблицами. Чтобы реализовать связь нескольких таблиц с использованием getList(), вам необходимо использовать метод select() и передать список необходимых полей из разных таблиц.
Пример использования метода getList() для связи нескольких таблиц:
use BitrixMainApplication; use BitrixMainEntity; $connection = Application::getConnection(); $query = new EntityQuery(UserTable::getEntity()); $query->setSelect([ 'ID', 'NAME', 'EMAIL', 'ORDER_ID' => 'Order.ID', 'ORDER_TITLE' => 'Order.TITLE', ]); $query->setFilter([ 'ACTIVE' => 'Y', ]); $query->setJoin([ [ 'table' => OrderTable::getTableName(), 'alias' => 'Order', 'type' => 'inner', 'on' => 'this.ID = Order.USER_ID', ], ]); $result = $query->exec(); while ($row = $result->fetch()) { echo "{$row['ID']}, {$row['NAME']}, {$row['EMAIL']}, {$row['ORDER_ID']}, {$row['ORDER_TITLE']}"; }
В этом примере мы выбираем данные из таблицы пользователей и таблицы заказов, которые связаны по полю User.ID и Order.USER_ID. Мы указываем алиасы для полей из таблицы заказов, чтобы они были доступны в результирующем массиве.
Теперь рассмотрим метод Query(), который предоставляет более широкий спектр возможностей при работе с несколькими таблицами. Метод Query() позволяет создавать сложные запросы с использованием JOIN, WHERE, GROUP BY, ORDER BY и других операторов SQL.
Пример использования метода Query() для связи нескольких таблиц:
use BitrixMainApplication; use BitrixMainEntity; $connection = Application::getConnection(); $query = new EntityQuery(); $query->setSelect([ 'User.ID', 'User.NAME', 'User.EMAIL', 'Order.ID', 'Order.TITLE', ]); $query->setFilter([ 'User.ACTIVE' => 'Y', ]); $query->setEntity(UserTable::getEntity()); $query->registerRuntimeField(null, new EntityExpressionField('ORDER_ID', 'Order.ID')); $query->registerRuntimeField(null, new EntityExpressionField('ORDER_TITLE', 'Order.TITLE')); $query->setJoin([ [ 'table' => OrderTable::getTableName(), 'alias' => 'Order', 'type' => 'inner', 'on' => 'this.ID = Order.USER_ID', ], ]); $result = $query->exec(); while ($row = $result->fetch()) { echo "{$row['ID']}, {$row['NAME']}, {$row['EMAIL']}, {$row['ORDER_ID']}, {$row['ORDER_TITLE']}"; }
В этом примере мы создаем объект запроса EntityQuery() и указываем необходимые поля для выборки из таблицы пользователей и таблицы заказов. Мы также настраиваем фильтр для активных пользователей и устанавливаем соединение между таблицами по полю User.ID и Order.USER_ID с использованием метода setJoin(). Кроме того, мы регистрируем вычисляемые поля ORDER_ID и ORDER_TITLE с помощью метода registerRuntimeField(), чтобы они были доступны в результирующем массиве.
Как видно из примеров, оба метода позволяют связывать несколько таблиц в одном запросе, но метод Query() позволяет более гибко настраивать запросы и использовать SQL-операторы. Выбор между этими методами зависит от ваших требований и уровня сложности запроса.