Покопался в ядре и обнаружил, что при вызове метода:
вызвыается метод:
Данный метод принимает в себя один параметр - "по умолчанию упущенные первичные ключи автоматически добавляются в 'select' методом", что в свою очередь создаёт дублирование записей. Но передать этот параметр не получится, так как метод exec не принимает никаких параметров. Повлиять извне не получится, так как у вызываемого метода (Query::buildQuery) область видимости protected.
Решение проблемы следующее. Наследуемся от Bitrix\Main\ORM\Query\Query и переопределяем метод buildQuery и меняем значение параметру по умолчанию на false:
Код |
---|
use Bitrix\Main\ORM\Query\Query;
class BaseQuery
extends Query
{
/**
* @param bool $forceObjectPrimary Добавлять упущенные первичные ключи в SELECT
*
* @return mixed|string
* @throws Main\ArgumentException
* @throws Main\SystemException
*/
protected function buildQuery($forceObjectPrimary = false)
{
return parent::buildQuery($forceObjectPrimary);
}
} |
Затем наследуемся от Bitrix\Main\ORM\Data\DataManager и переопределяем метод getQueryClass. Возвращаем созданную обёртку над Query.
Код |
---|
use Bitrix\Main\ORM\Data\DataManager;
abstract class BaseDataManager
extends DataManager
{
/**
* @return BaseQuery|string
*/
public static function getQueryClass()
{
return BaseQuery::class;
}
}
|
Для того, чтоб у Вас всё заработало, все таблицы должны быть унаследованы от класса BaseDataManager.
Вы всегда можете изменить значение в файле bitrix/modules/main/orm/query/query.php:2251, но это будет работать до первого обновления.
В моём случае мне помогло наследование.