• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/data/datamanager.php
  • Класс: Bitrix\Main\ORM\Data\DataManager
  • Вызов: DataManager::update
static function update($primary, array $data)
{
	global $USER_FIELD_MANAGER;

	// check primary
	static::normalizePrimary(
		$primary, isset($data["fields"]) && is_array($data["fields"]) ? $data["fields"] : $data
	);
	static::validatePrimary($primary);

	// compatibility
	$fields = $data;

	// prepare entity object for compatibility with new code
	$object = static::convertArrayToObject($fields, false, $primary);

	$entity = static::getEntity();
	$result = new UpdateResult();

	try
	{
		static::callOnBeforeUpdateEvent($object, $fields, $result);

		// actualize old-style fields array from object
		$fields = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);

		// uf values
		$ufdata = $object->collectValues(Values::CURRENT, FieldTypeMask::USERTYPE);

		// check data
		static::checkFields($result, $primary, $fields);

		// check uf data
		if (!empty($ufdata))
		{
			static::checkUfFields($object, $ufdata, $result);
		}

		// check if there is still some data
		if (empty($fields) && empty($ufdata))
		{
			return $result;
		}

		// return if any error
		if (!$result->isSuccess(true))
		{
			return $result;
		}

		static::callOnUpdateEvent($object, $fields, $ufdata);

		// use save modifiers
		$fieldsToDb = $fields;

		foreach ($fieldsToDb as $fieldName => $value)
		{
			$field = $entity->getField($fieldName);
			$fieldsToDb[$fieldName] = $field->modifyValueBeforeSave($value, $fields);
		}

		// save data
		if (!empty($fieldsToDb))
		{
			$connection = $entity->getConnection();
			$helper = $connection->getSqlHelper();

			$tableName = $entity->getDBTableName();

			$dataReplacedColumn = static::replaceFieldName($fieldsToDb);
			$update = $helper->prepareUpdate($tableName, $dataReplacedColumn);

			$replacedPrimary = static::replaceFieldName($primary);
			$id = array();
			foreach ($replacedPrimary as $k => $v)
			{
				$id[] = $helper->prepareAssignment($tableName, $k, $v);
			}
			$where = implode(' AND ', $id);

			$sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$where;
			$connection->queryExecute($sql, $update[1]);

			$result->setAffectedRowsCount($connection);
		}

		$result->setData($fields + $ufdata);
		$result->setPrimary($primary);
		$result->setObject($object);

		// save uf data
		if (!empty($ufdata))
		{
			$ufUserId = false;

			if ($object->authContext)
			{
				$ufUserId = $object->authContext->getUserId();
			}

			$USER_FIELD_MANAGER->update($entity->getUfId(), end($primary), $ufdata, $ufUserId);
		}

		static::cleanCache();

		// event after update
		static::callOnAfterUpdateEvent($object, $fields + $ufdata);
	}
	catch (\Exception $e)
	{
		// check result to avoid warning
		$result->isSuccess();

		throw $e;
	}

	return $result;
}