• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/objectify/collection.php
  • Класс: BitrixMainORMObjectifyCollection
  • Вызов: Collection::save
public function save($ignoreEvents = false)
{
	$result = new Result;

	/** @var EntityObject[] $addObjects */
	$addObjects = [];

	/** @var EntityObject[] $updateObjects */
	$updateObjects = [];

	foreach ($this->_objects as $object)
	{
		if ($object->sysGetState() === State::RAW)
		{
			$addObjects[] = ['__object' => $object];
		}
		elseif ($object->sysGetState() === State::CHANGED)
		{
			$updateObjects[] = $object;
		}
	}

	$dataClass = static::$dataClass;

	// multi add
	if (!empty($addObjects))
	{
		$result = $dataClass::addMulti($addObjects, $ignoreEvents);
	}

	// multi update
	if (!empty($updateObjects))
	{
		$areEqual = true;
		$primaries = [];

		$dataSample = $updateObjects[0]->collectValues(Values::CURRENT, FieldTypeMask::SCALAR | FieldTypeMask::USERTYPE);
		asort($dataSample);

		// get only scalar & uf data and check its uniqueness
		foreach ($updateObjects as $object)
		{
			$objectData = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR | FieldTypeMask::USERTYPE);
			asort($objectData);

			if ($dataSample !== $objectData)
			{
				$areEqual = false;
				break;
			}

			$primaries[] = $object->primary;
		}

		if ($areEqual)
		{
			// one query
			$result = $dataClass::updateMulti($primaries, $dataSample, $ignoreEvents);

			// post save
			foreach ($updateObjects as $object)
			{
				$object->sysSaveRelations($result);
				$object->sysPostSave();
			}
		}
		else
		{
			// each object separately
			foreach ($updateObjects as $object)
			{
				$objectResult = $object->save();

				if (!$objectResult->isSuccess())
				{
					$result->addErrors($objectResult->getErrors());
				}
			}
		}
	}

	return $result;
}