• Модуль: 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;
}