• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/location/tree.php
  • Класс: BitrixSaleLocationis
  • Вызов: is::mergeRelationsFromTemporalTable
static function mergeRelationsFromTemporalTable($temporalTabName, $additinalFlds = array(), $fldMap = array())
{
	$dbConnection = MainHttpApplication::getConnection();
	$dbHelper = $dbConnection->getSqlHelper();

	$temporalTabName = Assert::expectStringNotNull($temporalTabName, false, 'Name of temporal table must be a non-zero length string');
	$temporalTabName = $dbHelper->forSql($temporalTabName);

	$entityTableName = static::getTableName();

	if(!is_array($additinalFlds))
		$additinalFlds = array();

	$additinalFlds = array_merge(array('LEFT_MARGIN', 'RIGHT_MARGIN', 'DEPTH_LEVEL'), $additinalFlds);

	$fldReplace = array();
	foreach($additinalFlds as &$fld)
	{
		$fld = $dbHelper->forSql($fld);
		$fldReplace[$fld] = is_array($fldMap) && isset($fldMap[$fld]) ? $dbHelper->forSql($fldMap[$fld]) : $fld;
	}

	$idReplace = is_array($fldMap) && isset($fldMap['ID']) ? $dbHelper->forSql($fldMap['ID']) : 'ID';

	if($dbConnection->getType() == 'mysql')
	{
		$sql = 'update '.$entityTableName.', '.$temporalTabName.' set ';
		$additFldCnt = count($additinalFlds);

		for($i = 0; $i < $additFldCnt; $i++)
		{
			$sql .= $entityTableName.'.'.$additinalFlds[$i].' = '.$temporalTabName.'.'.$fldReplace[$additinalFlds[$i]].($i == count($additinalFlds) - 1 ? '' : ', ');
		}

		$sql .= ' where '.$entityTableName.'.ID = '.$temporalTabName.'.'.$idReplace;
	}
	elseif($dbConnection->getType() == 'mssql')
	{
		$sql = 'update '.$entityTableName.' set ';
		$additFldCnt = count($additinalFlds);

		for($i = 0; $i < $additFldCnt; $i++)
		{
			$sql .= $additinalFlds[$i].' = '.$temporalTabName.'.'.$fldReplace[$additinalFlds[$i]].($i == count($additinalFlds) - 1 ? '' : ', ');
		}

		$sql .= ' from '.$entityTableName.' join '.$temporalTabName.' on '.$entityTableName.'.ID = '.$temporalTabName.'.'.$idReplace;
	}
	elseif($dbConnection->getType() == 'oracle')
	{
		// update tab1 set (aa,bb) = (select aa,bb from tab2 where tab2.id = tab1.id)

		$sql = 'update '.$entityTableName.' set ('.
			implode(', ', $additinalFlds).
		') = (select '.
			implode(', ', $fldReplace).
		' from '.$temporalTabName.' where '.$entityTableName.'.ID = '.$temporalTabName.'.'.$idReplace.')';
	}

	$dbConnection->query($sql);
}