- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/orm/query/query.php
- Класс: Bitrix\Main\ORM\Query\Query
- Вызов: Query::buildQuery
protected function buildQuery($forceObjectPrimary = true)
{
$connection = $this->entity->getConnection();
$helper = $connection->getSqlHelper();
if ($this->query_build_parts === null)
{
foreach ($this->select as $key => $value)
{
$this->addToSelectChain($value, is_numeric($key) ? null : $key);
}
$this->setFilterChains($this->filter);
$this->divideFilter();
// unconditional entity scope
$this->entity->setDefaultScope($this);
$this->setFilterHandlerChains($this->filterHandler);
$this->divideFilterHandler();
foreach ($this->group as $value)
{
$this->addToGroupChain($value);
}
foreach ($this->order as $key => $value)
{
$this->addToOrderChain($key);
}
$this->buildJoinMap();
if ($forceObjectPrimary && empty($this->unionHandler))
{
$this->ensurePrimarySelect();
}
$sqlJoin = $this->buildJoin();
$sqlSelect = $this->buildSelect();
$sqlWhere = $this->buildWhere();
$sqlGroup = $this->buildGroup();
$sqlHaving = $this->buildHaving();
$sqlOrder = $this->buildOrder();
$sqlFrom = $this->quoteTableSource($this->entity->getDBTableName());
$sqlFrom .= ' '.$helper->quote($this->getInitAlias());
$sqlFrom .= ' '.$sqlJoin;
$this->query_build_parts = array_filter(array(
'SELECT' => $sqlSelect,
'FROM' => $sqlFrom,
'WHERE' => $sqlWhere,
'GROUP BY' => $sqlGroup,
'HAVING' => $sqlHaving,
'ORDER BY' => $sqlOrder
));
// ensure there are no private fields in query
$this->checkForPrivateFields();
}
$build_parts = $this->query_build_parts;
foreach ($build_parts as $k => &$v)
{
$v = $k . ' ' . $v;
}
$query = join("\n", $build_parts);
list($query, $replaced) = $this->replaceSelectAliases($query);
$this->replaced_aliases = $replaced;
if ($this->limit > 0)
{
$query = $helper->getTopSql($query, $this->limit, $this->offset);
}
// union
if (!empty($this->unionHandler))
{
if ($this->order || $this->limit)
{
$query = "({$query})";
}
foreach ($this->unionHandler->getQueries() as $union)
{
$query .= " ".$union->getSql();
}
// union sort
if ($this->unionHandler->getOrder())
{
$sqlUnionOrder = array();
foreach ($this->unionHandler->getOrder() as $definition => $sort)
{
$sqlDefinition = $connection->getSqlHelper()->quote(
$this->global_chains[$definition]->getAlias()
);
$sqlUnionOrder[] = $sqlDefinition . ' ' . $sort;
}
$query .= ' ORDER BY ' . join(', ', $sqlUnionOrder);
}
// union limit
if ($this->unionHandler->getLimit())
{
$query = $helper->getTopSql($query, $this->unionHandler->getLimit(), $this->unionHandler->getOffset());
}
}
return $query;
}