• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/objectify/collection.php
  • Класс: BitrixMainORMObjectifyCollection
  • Вызов: Collection::fill
public function fill($fields = FieldTypeMask::ALL)
{
	$entityPrimary = $this->_entity->getPrimaryArray();

	$primaryValues = [];
	$fieldsToSelect = [];

	// if field is the only one
	if (is_scalar($fields) && !is_numeric($fields))
	{
		$fields = [$fields];
	}

	// collect custom fields to select
	foreach ($this->_objects as $object)
	{
		$idleFields = is_array($fields)
			? $object->sysGetIdleFields($fields)
			: $object->sysGetIdleFieldsByMask($fields);

		if (!empty($idleFields))
		{
			$fieldsToSelect = array_unique(array_merge($fieldsToSelect, $idleFields));

			// add object to query
			$objectPrimary = $object->sysRequirePrimary();

			$primaryValues[] = count($objectPrimary) == 1
				? current($objectPrimary)
				: $objectPrimary;
		}
	}

	// add primary to select
	if (!empty($fieldsToSelect))
	{
		$fieldsToSelect = array_unique(array_merge($entityPrimary, $fieldsToSelect));

		// build primary filter
		$primaryFilter = Query::filter();

		if (count($entityPrimary) == 1)
		{
			// IN for single-primary objects
			$primaryFilter->whereIn($entityPrimary[0], $primaryValues);
		}
		else
		{
			// OR for multi-primary objects
			$primaryFilter->logic('or');

			foreach ($primaryValues as $objectPrimary)
			{
				// add each object as a separate condition
				$oneObjectFilter = Query::filter();

				foreach ($objectPrimary as $primaryName => $primaryValue)
				{
					$oneObjectFilter->where($primaryName, $primaryValue);
				}

				$primaryFilter->where($oneObjectFilter);
			}
		}

		// build query
		$dataClass = $this->_entity->getDataClass();
		$result = $dataClass::query()->setSelect($fieldsToSelect)->where($primaryFilter)->exec();

		// set object to identityMap of result, and it will be partially completed by fetch
		$im = new IdentityMap;

		foreach ($this->_objects as $object)
		{
			$im->put($object);
		}

		$result->setIdentityMap($im);
		$result->fetchCollection();
	}

	// return field value it it was only one
	if (is_array($fields) && count($fields) == 1 && $this->entity->hasField(current($fields)))
	{
		$fieldName = current($fields);
		$field = $this->entity->getField($fieldName);

		return ($field instanceof Relation)
			? $this->sysGetCollection($fieldName)
			: $this->sysGetList($fieldName);
	}
}