Bitrix-D7  20.5.0
Класс Entity

Base entity. Подробнее...

Граф наследования:Entity:
ElementEntity ValueStorageEntity CollectableEntity OrderBase ElementV1Entity ElementV2Entity BasketItemBase BasketPropertyItemBase Payment PropertyValueBase Shipment ShipmentItem ShipmentItemStore TradeBindingEntity Order

Открытые члены

 initializeField ($fieldName, $fieldInfo)
 Fields factory. Подробнее...
 
 initialize ($className)
 
 postInitialize ()
 
 getObjectClass ()
 Returns class of Object for current entity. Подробнее...
 
 getObjectClassName ()
 Returns class name of Object for current entity. Подробнее...
 
 getCollectionClass ()
 
 getCollectionClassName ()
 
 createObject ($setDefaultValues=true)
 
 createCollection ()
 
 wakeUpObject ($row)
 
 wakeUpCollection ($rows)
 
 addField ($fieldInfo, $fieldName=null)
 
 getReferencesCountTo ($refEntityName)
 
 getReferencesTo ($refEntityName)
 
 getFields ()
 
 getField ($name)
 
 hasField ($name)
 
 getScalarFields ()
 
 getUField ($name)
 
 hasUField ($name)
 
 getName ()
 
 getFullName ()
 
 getNamespace ()
 
 getModule ()
 
 getDataClass ()
 
 getConnection ()
 
 getDBTableName ()
 
 getPrimary ()
 
 getPrimaryArray ()
 
 getAutoIncrement ()
 
 isUts ()
 
 isUtm ()
 
 getUfId ()
 
 setDefaultScope ($query)
 
 getCode ()
 
 getLangCode ()
 
 getTitle ()
 
 __clone ()
 
 compileDbTableStructureDump ()
 
 createDbTable ()
 Creates table according to Fields collection. Подробнее...
 
 readFromCache ($ttl, $cacheId, $countTotal=false)
 Reads data from cache. Подробнее...
 
 writeToCache (Main\DB\Result $result, $cacheId, $countTotal=false)
 
 getCacheTtl ($ttl)
 Returns cache TTL for the entity, possibly limited by the .settings.php: 'cache_flags' => array('value'=> array( "b_group_max_ttl" => 200, "b_group_min_ttl" => 100, )) Maximum is a higher-priority. Подробнее...
 
 cleanCache ()
 Cleans all cache entries for the entity. Подробнее...
 
 enableFullTextIndex ($field, $mode=true)
 Sets a flag indicating full text index support for a field. Подробнее...
 
 fullTextIndexEnabled ($field)
 Returns true if full text index is enabled for a field. Подробнее...
 

Открытые статические члены

static get ($entityName)
 Returns entity object. Подробнее...
 
static has ($entityName)
 Checks if entity exists. Подробнее...
 
static getInstance ($entityName)
 
static getDefaultObjectClassName ($entityName)
 
static getDefaultCollectionClassName ($entityName)
 
static isExists ($name)
 
static normalizeEntityClass ($entityName)
 
static getEntityClassParts ($class)
 
static camel2snake ($str)
 
static snake2camel ($str)
 
static normalizeName ($entityName)
 
static getInstanceByQuery (Query $query, &$entity_name=null)
 
static compileEntity ($entityName, $fields=null, $parameters=array())
 
static compileObjectClass ($dataClass)
 
static compileCollectionClass ($dataClass)
 
static destroy ($entity)
 

Поля данных

 $name
 
 $connectionName
 
 $dbTableName
 
 $primary
 
 $autoIncrement
 
 $isUts
 
 $isUtm
 
const DEFAULT_OBJECT_PREFIX = 'EO_'
 

Защищенные члены

 appendField (Field $field)
 
 getCacheDir ()
 

Защищенные статические члены

static getInstanceDirect ($className)
 

Защищенные данные

 $className
 
 $module
 
 $uf_id
 
 $fields
 
 $fieldsMap
 
 $u_fields
 
 $code
 
 $references
 
 $isClone = false
 

Статические защищенные данные

static $instances
 

Подробное описание

Base entity.

См. определение в файле main/lib/orm/entity.php строка 25

Методы

◆ __clone()

__clone ( )

См. определение в файле main/lib/orm/entity.php строка 867

868  {
869  $this->isClone = true;
870  }

◆ addField()

addField (   $fieldInfo,
  $fieldName = null 
)
Аргументы
array | Field$fieldInfo
null | string$fieldName
Возвращает
Field|false
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 503

504  {
505  $field = $this->initializeField($fieldName, $fieldInfo);
506 
507  return $this->appendField($field) ? $field : false;
508  }
initializeField($fieldName, $fieldInfo)
Fields factory.

◆ appendField()

appendField ( Field  $field)
protected
Аргументы
Field$field
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 438

439  {
440  if (isset($this->fields[StringHelper::strtoupper($field->getName())]) && !$this->isClone)
441  {
442  trigger_error(sprintf(
443  'Entity `%s` already has Field with name `%s`.', $this->getFullName(), $field->getName()
444  ), E_USER_WARNING);
445 
446  return false;
447  }
448 
449  if ($field instanceof Reference)
450  {
451  // references cache
452  $this->references[$field->getRefEntityName()][] = $field;
453  }
454 
455  $this->fields[StringHelper::strtoupper($field->getName())] = $field;
456 
457  if ($field instanceof ScalarField && $field->isPrimary())
458  {
459  $this->primary[] = $field->getName();
460 
461  if($field->isAutocomplete())
462  {
463  $this->autoIncrement = $field->getName();
464  }
465  }
466 
467  // add reference field for UField iblock_section
468  if ($field instanceof UField && $field->getTypeId() == 'iblock_section')
469  {
470  $refFieldName = $field->getName().'_BY';
471 
472  if ($field->isMultiple())
473  {
474  $localFieldName = $field->getValueFieldName();
475  }
476  else
477  {
478  $localFieldName = $field->getName();
479  }
480 
481  $newFieldInfo = array(
482  'data_type' => 'Bitrix\Iblock\Section',
483  'reference' => array($localFieldName, 'ID')
484  );
485 
486  $newRefField = new Reference($refFieldName, $newFieldInfo['data_type'], $newFieldInfo['reference'][0], $newFieldInfo['reference'][1]);
487  $newRefField->setEntity($this);
488 
489  $this->fields[StringHelper::strtoupper($refFieldName)] = $newRefField;
490  }
491 
492  return true;
493  }
static strtoupper($str)
Regular uppercase with result cache.

◆ camel2snake()

static camel2snake (   $str)
static
Уст.:
Use Bitrix\StringHelper::camel2snake instead
Аргументы
$str
Возвращает
string

См. определение в файле main/lib/orm/entity.php строка 835

836  {
837  return StringHelper::camel2snake($str);
838  }
static camel2snake($str)
Changes registry from CamelCase to snake_case.

◆ cleanCache()

cleanCache ( )

Cleans all cache entries for the entity.

Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 1334

1335  {
1336  if($this->getCacheTtl(100) > 0)
1337  {
1338  //cache might be disabled in .settings.php via *_max_ttl = 0 option
1339  $cache = Main\Application::getInstance()->getManagedCache();
1340  $cache->cleanDir($this->getCacheDir());
1341  }
1342  }
static getInstance()
Returns current instance of the Application.
getCacheTtl($ttl)
Returns cache TTL for the entity, possibly limited by the .settings.php: 'cache_flags' => array('valu...

◆ compileCollectionClass()

static compileCollectionClass (   $dataClass)
static
Аргументы
$dataClass
Возвращает
Collection|string

См. определение в файле main/lib/orm/entity.php строка 1164

1165  {
1166  $dataClass = static::normalizeEntityClass($dataClass);
1167  $classParts = static::getEntityClassParts($dataClass);
1168 
1169  if (class_exists($dataClass::getCollectionClass(), false)
1170  && is_subclass_of($dataClass::getCollectionClass(), Collection::class))
1171  {
1172  // class is already defined
1173  return $dataClass::getCollectionClass();
1174  }
1175 
1176  $baseCollectionClass = '\\'.$dataClass::getCollectionParentClass();
1177  $collectionClassName = static::getDefaultCollectionClassName($classParts['name']);
1178 
1179  $eval = "";
1180  if($classParts['namespace'] <> '')
1181  {
1182  $eval .= "namespace {$classParts['namespace']} {";
1183  }
1184  $eval .= "class {$collectionClassName} extends {$baseCollectionClass} {";
1185  $eval .= "static public \$dataClass = '{$dataClass}';";
1186  $eval .= "}"; // end class
1187  if($classParts['namespace'] <> '')
1188  {
1189  $eval .= "}"; // end namespace
1190  }
1191 
1192  eval($eval);
1193 
1194  return $dataClass::getCollectionClass();
1195  }

◆ compileDbTableStructureDump()

compileDbTableStructureDump ( )
Возвращает
string[] Array of SQL queries
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 1079

1080  {
1081  $fields = $this->getScalarFields();
1082 
1083  /** @var Main\DB\MysqlCommonConnection $connection */
1084  $connection = $this->getConnection();
1085 
1086  $autocomplete = [];
1087  $unique = [];
1088 
1089  foreach ($fields as $field)
1090  {
1091  if ($field->isAutocomplete())
1092  {
1093  $autocomplete[] = $field->getName();
1094  }
1095 
1096  if ($field->isUnique())
1097  {
1098  $unique[] = $field->getName();
1099  }
1100  }
1101 
1102  // start collecting queries
1103  $connection->disableQueryExecuting();
1104 
1105  // create table
1106  $connection->createTable($this->getDBTableName(), $fields, $this->getPrimaryArray(), $autocomplete);
1107 
1108  // create indexes
1109  foreach ($unique as $fieldName)
1110  {
1111  $connection->createIndex($this->getDBTableName(), $fieldName, [$fieldName], null,
1112  Main\DB\MysqlCommonConnection::INDEX_UNIQUE);
1113  }
1114 
1115  // stop collecting queries
1116  $connection->enableQueryExecuting();
1117 
1118  return $connection->getDisabledQueryExecutingDump();
1119  }

◆ compileEntity()

static compileEntity (   $entityName,
  $fields = null,
  $parameters = array() 
)
static
Аргументы
string$entityName
null | array[] | Field[]$fields
array$parameters[namespace, table_name, uf_id, parent, parent_map, default_scope]
Возвращает
Entity
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 988

989  {
990  $classCode = '';
991  $classCodeEnd = '';
992 
993  if (strtolower(substr($entityName, -5)) !== 'table')
994  {
995  $entityName .= 'Table';
996  }
997 
998  // validation
999  if (!preg_match('/^[a-z0-9_]+$/i', $entityName))
1000  {
1001  throw new Main\ArgumentException(sprintf(
1002  'Invalid entity className `%s`.', $entityName
1003  ));
1004  }
1005 
1006  /** @var DataManager $fullEntityName */
1007  $fullEntityName = $entityName;
1008 
1009  // namespace configuration
1010  if (!empty($parameters['namespace']) && $parameters['namespace'] !== '\\')
1011  {
1012  $namespace = $parameters['namespace'];
1013 
1014  if (!preg_match('/^[a-z0-9_\\\\]+$/i', $namespace))
1015  {
1016  throw new Main\ArgumentException(sprintf(
1017  'Invalid namespace name `%s`', $namespace
1018  ));
1019  }
1020 
1021  $classCode = $classCode."namespace {$namespace} "."{";
1022  $classCodeEnd = '}'.$classCodeEnd;
1023 
1024  $fullEntityName = '\\'.$namespace.'\\'.$fullEntityName;
1025  }
1026 
1027  $parentClass = !empty($parameters['parent']) ? $parameters['parent'] : DataManager::class;
1028 
1029  // build entity code
1030  $classCode = $classCode."class {$entityName} extends \\".$parentClass." {";
1031  $classCodeEnd = '}'.$classCodeEnd;
1032 
1033  if (!empty($parameters['table_name']))
1034  {
1035  $classCode .= 'public static function getTableName(){return '.var_export($parameters['table_name'], true).';}';
1036  }
1037 
1038  if (!empty($parameters['uf_id']))
1039  {
1040  $classCode .= 'public static function getUfId(){return '.var_export($parameters['uf_id'], true).';}';
1041  }
1042 
1043  if (!empty($parameters['default_scope']))
1044  {
1045  $classCode .= 'public static function setDefaultScope($query){'.$parameters['default_scope'].'}';
1046  }
1047 
1048  if (isset($parameters['parent_map']) && $parameters['parent_map'] == false)
1049  {
1050  $classCode .= 'public static function getMap(){return [];}';
1051  }
1052 
1053  if(isset($parameters['object_parent']) && is_a($parameters['object_parent'], EntityObject::class, true))
1054  {
1055  $classCode .= 'public static function getObjectParentClass(){return '.var_export($parameters['object_parent'], true).';}';
1056  }
1057 
1058  // create entity
1059  eval($classCode.$classCodeEnd);
1060 
1061  $entity = $fullEntityName::getEntity();
1062 
1063  // add fields
1064  if (!empty($fields))
1065  {
1066  foreach ($fields as $fieldName => $field)
1067  {
1068  $entity->addField($field, $fieldName);
1069  }
1070  }
1071 
1072  return $entity;
1073  }

◆ compileObjectClass()

static compileObjectClass (   $dataClass)
static
Аргументы
$dataClass
Возвращает
EntityObject|string

См. определение в файле main/lib/orm/entity.php строка 1126

1127  {
1128  $dataClass = static::normalizeEntityClass($dataClass);
1129  $classParts = static::getEntityClassParts($dataClass);
1130 
1131  if (class_exists($dataClass::getObjectClass(), false)
1132  && is_subclass_of($dataClass::getObjectClass(), EntityObject::class))
1133  {
1134  // class is already defined
1135  return $dataClass::getObjectClass();
1136  }
1137 
1138  $baseObjectClass = '\\'.$dataClass::getObjectParentClass();
1139  $objectClassName = static::getDefaultObjectClassName($classParts['name']);
1140 
1141  $eval = "";
1142  if($classParts['namespace'] <> '')
1143  {
1144  $eval .= "namespace {$classParts['namespace']} {";
1145  }
1146  $eval .= "class {$objectClassName} extends {$baseObjectClass} {";
1147  $eval .= "static public \$dataClass = '{$dataClass}';";
1148  $eval .= "}"; // end class
1149  if($classParts['namespace'] <> '')
1150  {
1151  $eval .= "}"; // end namespace
1152  }
1153 
1154  eval($eval);
1155 
1156  return $dataClass::getObjectClass();
1157  }

◆ createCollection()

createCollection ( )
Возвращает
null Actual type should be annotated by orm:annotate

См. определение в файле main/lib/orm/entity.php строка 395

396  {
397  $collectionClass = $this->getCollectionClass();
398  return new $collectionClass($this);
399  }

◆ createDbTable()

createDbTable ( )

Creates table according to Fields collection.

Возвращает
void
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 1203

1204  {
1205  foreach ($this->compileDbTableStructureDump() as $sqlQuery)
1206  {
1207  $this->getConnection()->query($sqlQuery);
1208  }
1209  }

◆ createObject()

createObject (   $setDefaultValues = true)
Аргументы
bool$setDefaultValues
Возвращает
null Actual type should be annotated by orm:annotate

См. определение в файле main/lib/orm/entity.php строка 386

387  {
388  $objectClass = $this->getObjectClass();
389  return new $objectClass($setDefaultValues);
390  }
getObjectClass()
Returns class of Object for current entity.

◆ destroy()

static destroy (   $entity)
static
Аргументы
Entity | string$entity
Возвращает
bool

См. определение в файле main/lib/orm/entity.php строка 1216

1217  {
1218  if ($entity instanceof Entity)
1219  {
1220  $entityName = $entity->getDataClass();
1221  }
1222  else
1223  {
1224  $entityName = static::normalizeEntityClass($entity);
1225  }
1226 
1227  if (isset(self::$instances[$entityName]))
1228  {
1229  unset(self::$instances[$entityName]);
1230  DataManager::unsetEntity($entityName);
1231 
1232  return true;
1233  }
1234 
1235  return false;
1236  }

◆ enableFullTextIndex()

enableFullTextIndex (   $field,
  $mode = true 
)

Sets a flag indicating full text index support for a field.

Уст.:
Does nothing, mysql 5.6 has fulltext always enabled.
Аргументы
string$field
bool$mode

См. определение в файле main/lib/orm/entity.php строка 1351

1352  {
1353  }

◆ fullTextIndexEnabled()

fullTextIndexEnabled (   $field)

Returns true if full text index is enabled for a field.

Уст.:
Always returns true, mysql 5.6 has fulltext always enabled.
Аргументы
string$field
Возвращает
bool

См. определение в файле main/lib/orm/entity.php строка 1362

1363  {
1364  return true;
1365  }

◆ get()

static get (   $entityName)
static

Returns entity object.

Аргументы
$entityName
Возвращает
Entity
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 73

74  {
75  return static::getInstance($entityName);
76  }

◆ getAutoIncrement()

getAutoIncrement ( )

См. определение в файле main/lib/orm/entity.php строка 704

705  {
706  return $this->autoIncrement;
707  }

◆ getCacheDir()

getCacheDir ( )
protected

См. определение в файле main/lib/orm/entity.php строка 1324

1325  {
1326  return "orm_".$this->getDBTableName();
1327  }

◆ getCacheTtl()

getCacheTtl (   $ttl)

Returns cache TTL for the entity, possibly limited by the .settings.php: 'cache_flags' => array('value'=> array( "b_group_max_ttl" => 200, "b_group_min_ttl" => 100, )) Maximum is a higher-priority.

Аргументы
int$ttlPreferable TTL
Возвращает
int Calculated TTL

См. определение в файле main/lib/orm/entity.php строка 1309

1310  {
1311  $table = $this->getDBTableName();
1312  $cacheFlags = Main\Config\Configuration::getValue("cache_flags");
1313  if(isset($cacheFlags[$table."_min_ttl"]))
1314  {
1315  $ttl = (int)max($ttl, $cacheFlags[$table."_min_ttl"]);
1316  }
1317  if(isset($cacheFlags[$table."_max_ttl"]))
1318  {
1319  $ttl = (int)min($ttl, $cacheFlags[$table."_max_ttl"]);
1320  }
1321  return $ttl;
1322  }

◆ getCode()

getCode ( )

См. определение в файле main/lib/orm/entity.php строка 779

780  {
781  if ($this->code === null)
782  {
783  $this->code = '';
784 
785  // get absolute path to class
786  $class_path = explode('\\', strtoupper(ltrim($this->className, '\\')));
787 
788  // cut class name to leave namespace only
789  $class_path = array_slice($class_path, 0, -1);
790 
791  // cut Bitrix namespace
792  if ($class_path[0] === 'BITRIX')
793  {
794  $class_path = array_slice($class_path, 1);
795  }
796 
797  // glue module name
798  if (count($class_path))
799  {
800  $this->code = join('_', $class_path).'_';
801  }
802 
803  // glue entity name
804  $this->code .= strtoupper(StringHelper::camel2snake($this->getName()));
805  }
806 
807  return $this->code;
808  }

◆ getCollectionClass()

getCollectionClass ( )
Возвращает
Collection|string

См. определение в файле main/lib/orm/entity.php строка 359

360  {
361  $dataClass = $this->getDataClass();
362  return static::normalizeName($dataClass::getCollectionClass());
363  }

◆ getCollectionClassName()

getCollectionClassName ( )
Возвращает
Collection|string

См. определение в файле main/lib/orm/entity.php строка 368

369  {
370  $dataClass = $this->getDataClass();
371  return $dataClass::getCollectionClassName();
372  }

◆ getConnection()

getConnection ( )
Возвращает
Main\DB\Connection
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 682

683  {
684  /** @var Main\DB\Connection $conn */
685  $conn = Main\Application::getInstance()->getConnectionPool()->getConnection($this->connectionName);
686  return $conn;
687  }

◆ getDataClass()

getDataClass ( )
Возвращает
DataManager

См. определение в файле main/lib/orm/entity.php строка 673

674  {
675  return $this->className;
676  }

◆ getDBTableName()

getDBTableName ( )

См. определение в файле main/lib/orm/entity.php строка 689

690  {
691  return $this->dbTableName;
692  }

◆ getDefaultCollectionClassName()

static getDefaultCollectionClassName (   $entityName)
static

См. определение в файле main/lib/orm/entity.php строка 374

375  {
376  $className = static::DEFAULT_OBJECT_PREFIX.$entityName.'_Collection';
377 
378  return $className;
379  }

◆ getDefaultObjectClassName()

static getDefaultObjectClassName (   $entityName)
static

См. определение в файле main/lib/orm/entity.php строка 341

342  {
343  $className = $entityName;
344 
345  if ($className == '')
346  {
347  // entity without name
348  $className = 'NNM_Object';
349  }
350 
351  $className = static::DEFAULT_OBJECT_PREFIX.$className;
352 
353  return $className;
354  }

◆ getEntityClassParts()

static getEntityClassParts (   $class)
static

См. определение в файле main/lib/orm/entity.php строка 760

761  {
762  $class = static::normalizeEntityClass($class);
763  $lastPos = strrpos($class, '\\');
764 
765  if($lastPos === 0)
766  {
767  //global namespace
768  $namespace = "";
769  }
770  else
771  {
772  $namespace = substr($class, 1, $lastPos - 1);
773  }
774  $name = substr($class, $lastPos + 1, -5);
775 
776  return compact('namespace', 'name');
777  }

◆ getField()

getField (   $name)
Аргументы
$name
Возвращает
Field|ScalarField
Исключения
Main

Переопределяется в OrderBase и BasketItemBase.

См. определение в файле main/lib/orm/entity.php строка 543

544  {
545  if ($this->hasField($name))
546  {
547  return $this->fields[StringHelper::strtoupper($name)];
548  }
549 
550  throw new Main\ArgumentException(sprintf(
551  '%s Entity has no `%s` field.', $this->getName(), $name
552  ));
553  }

◆ getFields()

getFields ( )

См. определение в файле main/lib/orm/entity.php строка 532

533  {
534  return $this->fields;
535  }

◆ getFullName()

getFullName ( )

См. определение в файле main/lib/orm/entity.php строка 642

643  {
644  return substr($this->className, 0, -5);
645  }

◆ getInstance()

static getInstance (   $entityName)
static
Аргументы
string$entityName
Возвращает
Entity
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 100

101  {
102  $entityName = static::normalizeEntityClass($entityName);
103 
104  return self::getInstanceDirect($entityName);
105  }
static getInstanceDirect($className)

◆ getInstanceByQuery()

static getInstanceByQuery ( Query  $query,
$entity_name = null 
)
static
Аргументы
Query$query
null$entity_name
Возвращает
Entity
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 880

881  {
882  if ($entity_name === null)
883  {
884  $entity_name = 'Tmp'.randString().'x';
885  }
886  elseif (!preg_match('/^[a-z0-9_]+$/i', $entity_name))
887  {
888  throw new Main\ArgumentException(sprintf(
889  'Invalid entity name `%s`.', $entity_name
890  ));
891  }
892 
893  $query_string = '('.$query->getQuery().')';
894  $query_chains = $query->getChains();
895 
896  $replaced_aliases = array_flip($query->getReplacedAliases());
897 
898  // generate fieldsMap
899  $fieldsMap = array();
900 
901  foreach ($query->getSelect() as $k => $v)
902  {
903  // convert expressions to regular field, clone in case of regular scalar field
904  if (is_array($v))
905  {
906  // expression
907  $fieldsMap[$k] = array('data_type' => $v['data_type']);
908  }
909  else
910  {
911  if ($v instanceof ExpressionField)
912  {
913  $fieldDefinition = $v->getName();
914 
915  // better to initialize fields as objects after entity is created
916  $dataType = Field::getOldDataTypeByField($query_chains[$fieldDefinition]->getLastElement()->getValue());
917  $fieldsMap[$fieldDefinition] = array('data_type' => $dataType);
918  }
919  else
920  {
921  $fieldDefinition = is_numeric($k) ? $v : $k;
922 
923  /** @var Field $field */
924  $field = $query_chains[$fieldDefinition]->getLastElement()->getValue();
925 
926  if ($field instanceof ExpressionField)
927  {
928  $dataType = Field::getOldDataTypeByField($query_chains[$fieldDefinition]->getLastElement()->getValue());
929  $fieldsMap[$fieldDefinition] = array('data_type' => $dataType);
930  }
931  else
932  {
933  /** @var ScalarField[] $fieldsMap */
934  $fieldsMap[$fieldDefinition] = clone $field;
935  $fieldsMap[$fieldDefinition]->setName($fieldDefinition);
936  $fieldsMap[$fieldDefinition]->setColumnName($fieldDefinition);
937  $fieldsMap[$fieldDefinition]->resetEntity();
938  }
939  }
940  }
941 
942  if (isset($replaced_aliases[$k]))
943  {
944  if (is_array($fieldsMap[$k]))
945  {
946  $fieldsMap[$k]['column_name'] = $replaced_aliases[$k];
947  }
948  elseif ($fieldsMap[$k] instanceof ScalarField)
949  {
950  /** @var ScalarField[] $fieldsMap */
951  $fieldsMap[$k]->setColumnName($replaced_aliases[$k]);
952  }
953  }
954  }
955 
956  // generate class content
957  $eval = 'class '.$entity_name.'Table extends '.DataManager::class.' {'.PHP_EOL;
958  $eval .= 'public static function getMap() {'.PHP_EOL;
959  $eval .= 'return '.var_export(['TMP_ID' => ['data_type' => 'integer', 'primary' => true, 'auto_generated' => true]], true).';'.PHP_EOL;
960  $eval .= '}';
961  $eval .= 'public static function getTableName() {'.PHP_EOL;
962  $eval .= 'return '.var_export($query_string, true).';'.PHP_EOL;
963  $eval .= '}';
964  $eval .= '}';
965 
966  eval($eval);
967 
968  $entity = self::getInstance($entity_name);
969 
970  foreach ($fieldsMap as $k => $v)
971  {
972  $entity->addField($v, $k);
973  }
974 
975  return $entity;
976  }
static getInstance($entityName)

◆ getInstanceDirect()

static getInstanceDirect (   $className)
staticprotected
Аргументы
DataManager | string$className
Возвращает
mixed
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 114

115  {
116  if (empty(self::$instances[$className]))
117  {
118  /** @var Entity $entity */
119  $entityClass = $className::getEntityClass();
120 
121  // in case of calling Table class was not ended with entity initialization
122  if (empty(self::$instances[$className]))
123  {
124  $entity = new $entityClass;
125  $entity->initialize($className);
126  $entity->postInitialize();
127 
128  // call user-defined postInitialize
129  $className::postInitialize($entity);
130 
131  self::$instances[$className] = $entity;
132  }
133  }
134 
135  return self::$instances[$className];
136  }

◆ getLangCode()

getLangCode ( )

См. определение в файле main/lib/orm/entity.php строка 810

811  {
812  return $this->getCode().'_ENTITY';
813  }

◆ getModule()

getModule ( )

См. определение в файле main/lib/orm/entity.php строка 652

653  {
654  if($this->module === null)
655  {
656  // \Bitrix\Main\Site -> "main"
657  // \Partner\Module\Thing -> "partner.module"
658  // \Thing -> ""
659  $parts = explode("\\", $this->className);
660  if($parts[1] == "Bitrix")
661  $this->module = strtolower($parts[2]);
662  elseif(!empty($parts[1]) && isset($parts[2]))
663  $this->module = strtolower($parts[1].".".$parts[2]);
664  else
665  $this->module = "";
666  }
667  return $this->module;
668  }

◆ getName()

getName ( )

Переопределяется в PropertyValueBase.

См. определение в файле main/lib/orm/entity.php строка 637

638  {
639  return $this->name;
640  }

◆ getNamespace()

getNamespace ( )

См. определение в файле main/lib/orm/entity.php строка 647

648  {
649  return substr($this->className, 0, strrpos($this->className, '\\') + 1);
650  }

◆ getObjectClass()

getObjectClass ( )

Returns class of Object for current entity.

Возвращает
EntityObject|string

См. определение в файле main/lib/orm/entity.php строка 324

325  {
326  $dataManagerClass = $this->className;
327  return static::normalizeName($dataManagerClass::getObjectClass());
328  }

◆ getObjectClassName()

getObjectClassName ( )

Returns class name of Object for current entity.

Возвращает
EntityObject|string

См. определение в файле main/lib/orm/entity.php строка 335

336  {
337  $dataManagerClass = $this->className;
338  return $dataManagerClass::getObjectClassName();
339  }

◆ getPrimary()

getPrimary ( )

См. определение в файле main/lib/orm/entity.php строка 694

695  {
696  return count($this->primary) == 1 ? $this->primary[0] : $this->primary;
697  }

◆ getPrimaryArray()

getPrimaryArray ( )

См. определение в файле main/lib/orm/entity.php строка 699

700  {
701  return $this->primary;
702  }

◆ getReferencesCountTo()

getReferencesCountTo (   $refEntityName)

См. определение в файле main/lib/orm/entity.php строка 510

511  {
512  if (array_key_exists($key = strtolower($refEntityName), $this->references))
513  {
514  return count($this->references[$key]);
515  }
516 
517  return 0;
518  }

◆ getReferencesTo()

getReferencesTo (   $refEntityName)

См. определение в файле main/lib/orm/entity.php строка 521

522  {
523  if (array_key_exists($key = strtolower($refEntityName), $this->references))
524  {
525  return $this->references[$key];
526  }
527 
528  return array();
529  }

◆ getScalarFields()

getScalarFields ( )
Возвращает
ScalarField[]

См. определение в файле main/lib/orm/entity.php строка 563

564  {
565  $scalarFields = array();
566 
567  foreach ($this->getFields() as $field)
568  {
569  if ($field instanceof ScalarField)
570  {
571  $scalarFields[$field->getName()] = $field;
572  }
573  }
574 
575  return $scalarFields;
576  }

◆ getTitle()

getTitle ( )

См. определение в файле main/lib/orm/entity.php строка 815

816  {
817  $dataClass = $this->getDataClass();
818  $title = $dataClass::getTitle();
819 
820  if ($title === null)
821  {
823  }
824 
825  return $title;
826  }
static getMessage($code, $replace=null, $language=null)
Returns translation by message code.
Definition: loc.php:29
getTitle()
Get filter.
Definition: resultview.php:80

◆ getUfId()

getUfId ( )

Переопределяется в Shipment, Payment, OrderBase и Order.

См. определение в файле main/lib/orm/entity.php строка 719

720  {
721  return $this->uf_id;
722  }

◆ getUField()

getUField (   $name)
Уст.:
Аргументы
$name
Возвращает
UField
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 587

588  {
589  if ($this->hasUField($name))
590  {
591  return $this->u_fields[$name];
592  }
593 
594  throw new Main\ArgumentException(sprintf(
595  '%s Entity has no `%s` userfield.', $this->getName(), $name
596  ));
597  }

◆ has()

static has (   $entityName)
static

Checks if entity exists.

Аргументы
$entityName
Возвращает
bool

См. определение в файле main/lib/orm/entity.php строка 85

86  {
87  $entityClass = static::normalizeEntityClass($entityName);
88  return class_exists($entityClass);
89  }

◆ hasField()

hasField (   $name)

См. определение в файле main/lib/orm/entity.php строка 555

556  {
557  return isset($this->fields[StringHelper::strtoupper($name)]);
558  }

◆ hasUField()

hasUField (   $name)
Уст.:
Аргументы
$name
Возвращает
bool
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 607

608  {
609  if (is_null($this->u_fields))
610  {
611  $this->u_fields = array();
612 
613  if($this->uf_id <> '')
614  {
615  /** @var \CUserTypeManager $USER_FIELD_MANAGER */
616  global $USER_FIELD_MANAGER;
617 
618  foreach($USER_FIELD_MANAGER->getUserFields($this->uf_id) as $info)
619  {
620  $this->u_fields[$info['FIELD_NAME']] = new UField($info);
621  $this->u_fields[$info['FIELD_NAME']]->setEntity($this);
622 
623  // add references for ufield (UF_DEPARTMENT_BY)
624  if($info['USER_TYPE_ID'] == 'iblock_section')
625  {
626  $info['FIELD_NAME'] .= '_BY';
627  $this->u_fields[$info['FIELD_NAME']] = new UField($info);
628  $this->u_fields[$info['FIELD_NAME']]->setEntity($this);
629  }
630  }
631  }
632  }
633 
634  return isset($this->u_fields[$name]);
635  }

◆ initialize()

initialize (   $className)

См. определение в файле main/lib/orm/entity.php строка 220

221  {
222  /** @var $className DataManager */
223  $this->className = $className;
224 
225  /** @var DataManager $className */
226  $this->connectionName = $className::getConnectionName();
227  $this->dbTableName = $className::getTableName();
228  $this->fieldsMap = $className::getMap();
229  $this->uf_id = $className::getUfId();
230  $this->isUts = $className::isUts();
231  $this->isUtm = $className::isUtm();
232 
233  // object & collection classes
234  // Loader::registerObjectClass($className::getObjectClass(), $className);
235  // Loader::registerCollectionClass($className::getCollectionClass(), $className);
236  }

◆ initializeField()

initializeField (   $fieldName,
  $fieldInfo 
)

Fields factory.

Аргументы
string$fieldName
array | Field$fieldInfo
Возвращает
Field
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 148

149  {
150  if ($fieldInfo instanceof Field)
151  {
152  $field = $fieldInfo;
153 
154  // rewrite name
155  if (!empty($fieldName) && !is_numeric($fieldName))
156  {
157  $field->setName($fieldName);
158  }
159  }
160  elseif (is_array($fieldInfo))
161  {
162  if (!empty($fieldInfo['reference']))
163  {
164  if (is_string($fieldInfo['data_type']) && strpos($fieldInfo['data_type'], '\\') === false)
165  {
166  // if reference has no namespace, then it'is in the same namespace
167  $fieldInfo['data_type'] = $this->getNamespace().$fieldInfo['data_type'];
168  }
169 
170  //$refEntity = Base::getInstance($fieldInfo['data_type']."Table");
171  $field = new Reference($fieldName, $fieldInfo['data_type'], $fieldInfo['reference'], $fieldInfo);
172  }
173  elseif (!empty($fieldInfo['expression']))
174  {
175  $expression = array_shift($fieldInfo['expression']);
176  $buildFrom = $fieldInfo['expression'];
177 
178  $field = new ExpressionField($fieldName, $expression, $buildFrom, $fieldInfo);
179  }
180  elseif (!empty($fieldInfo['USER_TYPE_ID']))
181  {
182  $field = new UField($fieldInfo);
183  }
184  else
185  {
186  $fieldClass = StringHelper::snake2camel($fieldInfo['data_type']) . 'Field';
187  $fieldClass = '\\Bitrix\\Main\\Entity\\'.$fieldClass;
188 
189  if (strlen($fieldInfo['data_type']) && class_exists($fieldClass))
190  {
191  $field = new $fieldClass($fieldName, $fieldInfo);
192  }
193  elseif (strlen($fieldInfo['data_type']) && class_exists($fieldInfo['data_type']))
194  {
195  $fieldClass = $fieldInfo['data_type'];
196  $field = new $fieldClass($fieldName, $fieldInfo);
197  }
198  else
199  {
200  throw new Main\ArgumentException(sprintf(
201  'Unknown data type "%s" found for `%s` field in %s Entity.',
202  $fieldInfo['data_type'], $fieldName, $this->getName()
203  ));
204  }
205  }
206  }
207  else
208  {
209  throw new Main\ArgumentException(sprintf('Unknown field type `%s`',
210  is_object($fieldInfo) ? get_class($fieldInfo) : gettype($fieldInfo)
211  ));
212  }
213 
214  $field->setEntity($this);
215  $field->postInitialize();
216 
217  return $field;
218  }
static snake2camel($str)
Changes registry from snake_case or SNAKE_CASE to CamelCase.

◆ isExists()

static isExists (   $name)
static

Переопределяется в OrderBase.

См. определение в файле main/lib/orm/entity.php строка 735

736  {
737  return class_exists(static::normalizeEntityClass($name));
738  }

◆ isUtm()

isUtm ( )

См. определение в файле main/lib/orm/entity.php строка 714

715  {
716  return $this->isUtm;
717  }

◆ isUts()

isUts ( )

См. определение в файле main/lib/orm/entity.php строка 709

710  {
711  return $this->isUts;
712  }

◆ normalizeEntityClass()

static normalizeEntityClass (   $entityName)
static
Аргументы
$entityName
Возвращает
string|DataManager

См. определение в файле main/lib/orm/entity.php строка 745

746  {
747  if (strtolower(substr($entityName, -5)) !== 'table')
748  {
749  $entityName .= 'Table';
750  }
751 
752  if (substr($entityName, 0, 1) !== '\\')
753  {
754  $entityName = '\\'.$entityName;
755  }
756 
757  return $entityName;
758  }

◆ normalizeName()

static normalizeName (   $entityName)
static

См. определение в файле main/lib/orm/entity.php строка 852

853  {
854  if (substr($entityName, 0, 1) !== '\\')
855  {
856  $entityName = '\\'.$entityName;
857  }
858 
859  if (strtolower(substr($entityName, -5)) === 'table')
860  {
861  $entityName = substr($entityName, 0, -5);
862  }
863 
864  return $entityName;
865  }

◆ postInitialize()

postInitialize ( )
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 242

243  {
244  // basic properties
245  $classPath = explode('\\', ltrim($this->className, '\\'));
246  $this->name = substr(end($classPath), 0, -5);
247 
248  // default db table name
249  if (is_null($this->dbTableName))
250  {
251  $_classPath = array_slice($classPath, 0, -1);
252 
253  $this->dbTableName = 'b_';
254 
255  foreach ($_classPath as $i => $_pathElem)
256  {
257  if ($i == 0 && $_pathElem == 'Bitrix')
258  {
259  // skip bitrix namespace
260  continue;
261  }
262 
263  if ($i == 1 && $_pathElem == 'Main')
264  {
265  // also skip Main module
266  continue;
267  }
268 
269  $this->dbTableName .= strtolower($_pathElem).'_';
270  }
271 
272  // add class
273  if ($this->name !== end($_classPath))
274  {
275  $this->dbTableName .= StringHelper::camel2snake($this->name);
276  }
277  else
278  {
279  $this->dbTableName = substr($this->dbTableName, 0, -1);
280  }
281  }
282 
283  $this->primary = array();
284  $this->references = array();
285 
286  // attributes
287  foreach ($this->fieldsMap as $fieldName => &$fieldInfo)
288  {
289  $this->addField($fieldInfo, $fieldName);
290  }
291 
292  if (!empty($this->fieldsMap) && empty($this->primary))
293  {
294  throw new Main\SystemException(sprintf('Primary not found for %s Entity', $this->name));
295  }
296 
297  // attach userfields
298  if (empty($this->uf_id))
299  {
300  // try to find ENTITY_ID by map
301  $userTypeManager = Main\Application::getUserTypeManager();
302  if($userTypeManager)
303  {
304  $entityList = $userTypeManager->getEntityList();
305  $ufId = is_array($entityList) ? array_search($this->className, $entityList) : false;
306  if ($ufId !== false)
307  {
308  $this->uf_id = $ufId;
309  }
310  }
311  }
312 
313  if (!empty($this->uf_id))
314  {
315  Main\UserFieldTable::attachFields($this, $this->uf_id);
316  }
317  }
static getUserTypeManager()
Returns UF manager.
addField($fieldInfo, $fieldName=null)
static attachFields(ORM\Entity $entity, $ufId)

◆ readFromCache()

readFromCache (   $ttl,
  $cacheId,
  $countTotal = false 
)

Reads data from cache.

Аргументы
int$ttlTTL.
string$cacheIdThe cache ID.
bool$countTotalWhether to read total count from the cache.
Возвращает
Main\DB\ArrayResult|null
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 1248

1249  {
1250  if($ttl > 0)
1251  {
1252  $cache = Main\Application::getInstance()->getManagedCache();
1253  $cacheDir = $this->getCacheDir();
1254 
1255  $count = null;
1256  if($countTotal && $cache->read($ttl, $cacheId.".total", $cacheDir))
1257  {
1258  $count = $cache->get($cacheId.".total");
1259  }
1260  if($cache->read($ttl, $cacheId, $cacheDir))
1261  {
1262  $result = new Main\DB\ArrayResult($cache->get($cacheId));
1263  if($count !== null)
1264  {
1265  $result->setCount($count);
1266  }
1267  return $result;
1268  }
1269  }
1270  return null;
1271  }

◆ setDefaultScope()

setDefaultScope (   $query)
Аргументы
Query$query
Возвращает
Query

См. определение в файле main/lib/orm/entity.php строка 729

730  {
731  $dataClass = $this->className;
732  return $dataClass::setDefaultScope($query);
733  }

◆ snake2camel()

static snake2camel (   $str)
static
Уст.:
Use Bitrix\StringHelper::snake2camel instead
Аргументы
$str
Возвращает
mixed

См. определение в файле main/lib/orm/entity.php строка 847

848  {
849  return StringHelper::snake2camel($str);
850  }

◆ wakeUpCollection()

wakeUpCollection (   $rows)
См. также
Collection::wakeUp()
Аргументы
$rows
Возвращает
null Actual type should be annotated by orm:annotate
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 425

426  {
427  $collectionClass = $this->getCollectionClass();
428  return $collectionClass::wakeUp($rows);
429  }

◆ wakeUpObject()

wakeUpObject (   $row)
См. также
EntityObject::wakeUp()
Аргументы
$row
Возвращает
null Actual type should be annotated by orm:annotate
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 410

411  {
412  $objectClass = $this->getObjectClass();
413  return $objectClass::wakeUp($row);
414  }

◆ writeToCache()

writeToCache ( Main\DB\Result  $result,
  $cacheId,
  $countTotal = false 
)
Аргументы
Main\DB\Result$resultA query result to cache.
string$cacheIdThe cache ID.
bool$countTotalWhether to write total count to the cache.
Возвращает
Main\DB\ArrayResult
Исключения
Main

См. определение в файле main/lib/orm/entity.php строка 1282

1283  {
1284  $rows = $result->fetchAll();
1285  $arrayResult = new Main\DB\ArrayResult($rows);
1286 
1287  $cache = Main\Application::getInstance()->getManagedCache();
1288  $cache->set($cacheId, $rows);
1289 
1290  if($countTotal)
1291  {
1292  $count = $result->getCount();
1293  $cache->set($cacheId.".total", $count);
1294  $arrayResult->setCount($count);
1295  }
1296  return $arrayResult;
1297  }

Поля

◆ $autoIncrement

$autoIncrement

См. определение в файле main/lib/orm/entity.php строка 36

◆ $className

$className
protected

См. определение в файле main/lib/orm/entity.php строка 28

◆ $code

$code
protected

См. определение в файле main/lib/orm/entity.php строка 52

◆ $connectionName

$connectionName

См. определение в файле main/lib/orm/entity.php строка 33

◆ $dbTableName

$dbTableName

См. определение в файле main/lib/orm/entity.php строка 34

◆ $fields

$fields
protected

См. определение в файле main/lib/orm/entity.php строка 44

◆ $fieldsMap

$fieldsMap
protected

См. определение в файле main/lib/orm/entity.php строка 46

◆ $instances

$instances
staticprotected

См. определение в файле main/lib/orm/entity.php строка 57

◆ $isClone

$isClone = false
protected

См. определение в файле main/lib/orm/entity.php строка 60

◆ $isUtm

См. определение в файле main/lib/orm/entity.php строка 41

◆ $isUts

См. определение в файле main/lib/orm/entity.php строка 40

◆ $module

$module
protected

См. определение в файле main/lib/orm/entity.php строка 31

◆ $name

$name

См. определение в файле main/lib/orm/entity.php строка 32

◆ $primary

$primary

См. определение в файле main/lib/orm/entity.php строка 35

◆ $references

$references
protected

См. определение в файле main/lib/orm/entity.php строка 54

◆ $u_fields

$u_fields
protected

См. определение в файле main/lib/orm/entity.php строка 49

◆ $uf_id

$uf_id
protected

См. определение в файле main/lib/orm/entity.php строка 39

◆ DEFAULT_OBJECT_PREFIX

const DEFAULT_OBJECT_PREFIX = 'EO_'

См. определение в файле main/lib/orm/entity.php строка 62


Объявления и описания членов класса находятся в файле: