Bitrix-D7  20.5.0
Класс EntityObject
Граф наследования:EntityObject:
ValueStorage Item Type

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

 __construct ($setDefaultValues=true)
 EntityObject constructor. Подробнее...
 
 __clone ()
 
 collectValues ($valuesType=Values::ALL, $fieldsMask=FieldTypeMask::ALL, $recursive=false)
 Returns all objects values as an array. Подробнее...
 
 save ()
 ActiveRecord save. Подробнее...
 
 delete ()
 ActiveRecord delete. Подробнее...
 
 fill ($fields=FieldTypeMask::ALL)
 Fills all the values and relations of object. Подробнее...
 
 getId ()
 Fast popular alternative to __call(). Подробнее...
 
 get ($fieldName)
 
 remindActual ($fieldName)
 

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

static wakeUp ($row)
 Constructs existing object from pre-selected data, including references and relations. Подробнее...
 

Статические открытые данные

static $dataClass
 

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

 cloneValues (array $values)
 
 filterValuesByMask (array $values, int $fieldsMask, bool $invertedFilter=false)
 

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

 $_entity
 
 $_state = State::RAW
 
 $_actualValues = []
 
 $_currentValues = []
 
 $_runtimeValues = []
 
 $_customData = null
 
 $_onPrimarySetListeners = []
 
 $_authContext
 

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

static $_camelToSnakeCache = []
 
static $_snakeToCamelCache = []
 

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

См. определение в файле entityobject.php строка 47

Конструктор(ы)

◆ __construct()

__construct (   $setDefaultValues = true)
final

EntityObject constructor.

Аргументы
bool | array$setDefaultValues
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 113

114  {
115  if (is_array($setDefaultValues))
116  {
117  // we have custom default values
118  foreach ($setDefaultValues as $fieldName => $defaultValue)
119  {
120  $this->set($fieldName, $defaultValue);
121  }
122  }
123 
124  if ($setDefaultValues || is_array($setDefaultValues))
125  {
126  foreach ($this->entity->getScalarFields() as $fieldName => $field)
127  {
128  if ($this->sysHasValue($fieldName))
129  {
130  // already set custom default value
131  continue;
132  }
133 
134  $defaultValue = $field->getDefaultValue($this);
135 
136  if ($defaultValue !== null)
137  {
138  $this->set($fieldName, $defaultValue);
139  }
140  }
141  }
142  }

Методы

◆ __clone()

__clone ( )

См. определение в файле entityobject.php строка 144

145  {
146  $this->_actualValues = $this->cloneValues($this->_actualValues);
147  $this->_currentValues = $this->cloneValues($this->_currentValues);
148  }

◆ cloneValues()

cloneValues ( array  $values)
protected

См. определение в файле entityobject.php строка 150

150  : array
151  {
152  // Do not clone References to avoid infinite recursion
153  $valuesWithoutReferences = $this->filterValuesByMask($values, FieldTypeMask::REFERENCE, true);
154  $references = array_diff_key($values, $valuesWithoutReferences);
155 
156  return array_merge($references, \Bitrix\Main\Type\Collection::clone($valuesWithoutReferences));
157  }
filterValuesByMask(array $values, int $fieldsMask, bool $invertedFilter=false)

◆ collectValues()

collectValues (   $valuesType = Values::ALL,
  $fieldsMask = FieldTypeMask::ALL,
  $recursive = false 
)
final

Returns all objects values as an array.

Аргументы
int$valuesType
int$fieldsMask
bool$recursive
Возвращает
array
Исключения
ArgumentException

См. определение в файле entityobject.php строка 185

186  {
187  switch ($valuesType)
188  {
189  case Values::ACTUAL:
190  $objectValues = $this->_actualValues;
191  break;
192  case Values::CURRENT:
193  $objectValues = $this->_currentValues;
194  break;
195  default:
196  $objectValues = array_merge($this->_actualValues, $this->_currentValues);
197  }
198 
199  // filter with field mask
200  if ($fieldsMask !== FieldTypeMask::ALL)
201  {
202  foreach ($objectValues as $fieldName => $value)
203  {
204  $fieldMask = $this->entity->getField($fieldName)->getTypeMask();
205  if (!($fieldsMask & $fieldMask))
206  {
207  unset($objectValues[$fieldName]);
208  }
209  }
210  }
211 
212  // recursive convert object to array
213  if ($recursive)
214  {
215  foreach ($objectValues as $fieldName => $value)
216  {
217  if ($value instanceof EntityObject)
218  {
219  $objectValues[$fieldName] = $value->collectValues($valuesType, $fieldsMask, $recursive);
220  }
221  elseif ($value instanceof Collection)
222  {
223  $arrayCollection = [];
224  foreach ($value as $relationObject)
225  {
226  $arrayCollection[] = $relationObject->collectValues($valuesType, $fieldsMask, $recursive);
227  }
228  $objectValues[$fieldName] = $arrayCollection;
229  }
230  }
231  }
232 
233  // remap from uppercase to real field names
234  $values = [];
235 
236  foreach ($objectValues as $k => $v)
237  {
238  $values[$this->entity->getField($k)->getName()] = $v;
239  }
240 
241  return $values;
242  }

◆ delete()

delete ( )
final

ActiveRecord delete.

Возвращает
Result
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 333

334  {
335  $result = new Result;
336 
337  // delete relations
338  foreach ($this->entity->getFields() as $field)
339  {
340  if ($field instanceof Reference)
341  {
342  if ($field->getCascadeDeletePolicy() === CascadePolicy::FOLLOW)
343  {
344  /** @var EntityObject $remoteObject */
345  $remoteObject = $this->sysGetValue($field->getName());
346  $remoteObject->delete();
347  }
348  }
349  elseif ($field instanceof OneToMany)
350  {
351  if ($field->getCascadeDeletePolicy() === CascadePolicy::FOLLOW)
352  {
353  // delete
354  $collection = $this->sysFillRelationCollection($field);
355 
356  foreach ($collection as $object)
357  {
358  $object->delete();
359  }
360  }
361  elseif ($field->getCascadeDeletePolicy() === CascadePolicy::SET_NULL)
362  {
363  // set null
364  $this->sysRemoveAllFromCollection($field->getName());
365  }
366  }
367  elseif ($field instanceof ManyToMany)
368  {
369  if ($field->getCascadeDeletePolicy() === CascadePolicy::FOLLOW_ORPHANS)
370  {
371  // delete
372  }
373  elseif ($field->getCascadeDeletePolicy() === CascadePolicy::SET_NULL)
374  {
375  // set null
376  }
377 
378  // always delete mediator records
379  $this->sysRemoveAllFromCollection($field->getName());
380  }
381  }
382 
383  $this->sysSaveRelations($result);
384 
385  // delete object itself
386  $dataClass = static::$dataClass;
387  $deleteResult = $dataClass::delete($this->primary);
388 
389  if (!$deleteResult->isSuccess())
390  {
391  $result->addErrors($deleteResult->getErrors());
392  }
393 
394  // clear status
395  foreach ($this->entity->getPrimaryArray()as $primaryName)
396  {
397  unset($this->_actualValues[$primaryName]);
398  }
399 
400  $this->sysChangeState(State::DELETED);
401 
402  return $result;
403  }

◆ fill()

fill (   $fields = FieldTypeMask::ALL)
final

Fills all the values and relations of object.

Аргументы
int | string[]$fieldsNames of fields to fill
Возвращает
mixed
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 525

526  {
527  // object must have primary
528  $primaryFilter = Query::filter();
529 
530  foreach ($this->sysRequirePrimary() as $primaryName => $primaryValue)
531  {
532  $primaryFilter->where($primaryName, $primaryValue);
533  }
534 
535  // collect fields to be selected
536  if (is_array($fields))
537  {
538  // go through IDLE fields
539  $fieldsToSelect = $this->sysGetIdleFields($fields);
540  }
541  elseif (is_scalar($fields) && !is_numeric($fields))
542  {
543  // one custom field
544  $fields = [$fields];
545  $fieldsToSelect = $this->sysGetIdleFields($fields);
546  }
547  else
548  {
549  // get fields according to selector mask
550  $fieldsToSelect = $this->sysGetIdleFieldsByMask($fields);
551  }
552 
553  if (!empty($fieldsToSelect))
554  {
555  $fieldsToSelect = array_merge($this->entity->getPrimaryArray(), $fieldsToSelect);
556 
557  // build query
558  $dataClass = $this->entity->getDataClass();
559  $result = $dataClass::query()->setSelect($fieldsToSelect)->where($primaryFilter)->exec();
560 
561  // set object to identityMap of result, and it will be partially completed by fetch
562  $im = new IdentityMap;
563  $im->put($this);
564 
565  $result->setIdentityMap($im);
566  $result->fetchObject();
567 
568  // set filled flag to collections
569  foreach ($fieldsToSelect as $fieldName)
570  {
571  // check field before continue, it could be remote REF.ID definition so we skip it here
572  if ($this->entity->hasField($fieldName))
573  {
574  $field = $this->entity->getField($fieldName);
575 
576  if ($field instanceof OneToMany || $field instanceof ManyToMany)
577  {
578  /** @var Collection $collection */
579  $collection = $this->sysGetValue($fieldName);
580 
581  if (empty($collection))
582  {
583  $collection = $field->getRefEntity()->createCollection();
584  $this->_actualValues[$fieldName] = $collection;
585  }
586 
587  $collection->sysSetFilled();
588  }
589  }
590  }
591  }
592 
593  // return field value it it was only one
594  if (is_array($fields) && count($fields) == 1 && $this->entity->hasField(current($fields)))
595  {
596  return $this->sysGetValue(current($fields));
597  }
598 
599  return null;
600  }
static filter()
Returns new instance of Filter.

◆ filterValuesByMask()

filterValuesByMask ( array  $values,
int  $fieldsMask,
bool  $invertedFilter = false 
)
protected

См. определение в файле entityobject.php строка 159

159  : array
160  {
161  if ($fieldsMask === FieldTypeMask::ALL)
162  {
163  return $invertedFilter ? [] : $values;
164  }
165 
166  return array_filter($values, function($fieldName) use ($fieldsMask, $invertedFilter)
167  {
168  $maskOfSingleField = $this->entity->getField($fieldName)->getTypeMask();
169  $matchesMask = (bool)($fieldsMask & $maskOfSingleField);
170 
171  return $invertedFilter ? !$matchesMask: $matchesMask;
172  }, ARRAY_FILTER_USE_KEY);
173  }

◆ get()

get (   $fieldName)
final
Аргументы
$fieldName
Возвращает
mixed
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 637

638  {
639  return $this->__call(__FUNCTION__, func_get_args());
640  }

◆ getId()

getId ( )

Fast popular alternative to __call().

Возвращает
Collection|EntityObject|mixed
Исключения
SystemException

См. определение в файле entityobject.php строка 608

609  {
610  if (array_key_exists('ID', $this->_currentValues))
611  {
612  return $this->_currentValues['ID'];
613  }
614  elseif (array_key_exists('ID', $this->_actualValues))
615  {
616  return $this->_actualValues['ID'];
617  }
618  elseif (!$this->entity->hasField('ID'))
619  {
620  throw new SystemException(sprintf(
621  'Unknown method `%s` for object `%s`', 'getId', get_called_class()
622  ));
623  }
624  else
625  {
626  return null;
627  }
628  }

◆ remindActual()

remindActual (   $fieldName)
final
Аргументы
$fieldName
Возвращает
mixed
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 649

650  {
651  return $this->__call(__FUNCTION__, func_get_args());
652  }

◆ save()

save ( )
final

ActiveRecord save.

Возвращает
Result
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 252

253  {
254  // default empty result
255  switch ($this->state)
256  {
257  case State::RAW:
258  $result = new AddResult;
259  break;
260  case State::CHANGED:
261  case State::ACTUAL:
262  $result = new UpdateResult;
263  break;
264  default:
265  $result = new Result;
266  }
267 
268  $dataClass = $this->entity->getDataClass();
269 
270  if ($this->_state == State::RAW)
271  {
272  $data = $this->_currentValues;
273  $data['__object'] = $this;
274 
275  // put secret key __object to array
276  $result = $dataClass::add($data);
277 
278  // check for error
279  if (!$result->isSuccess())
280  {
281  return $result;
282  }
283 
284  // set primary
285  foreach ($result->getPrimary() as $primaryName => $primaryValue)
286  {
287  $this->sysSetActual($primaryName, $primaryValue);
288  }
289 
290  // on primary gain event
291  $this->sysOnPrimarySet();
292  }
293  elseif ($this->_state == State::CHANGED)
294  {
295  // changed scalar and reference
296  if (!empty($this->_currentValues))
297  {
298  $data = $this->_currentValues;
299  $data['__object'] = $this;
300 
301  // put secret key __object to array
302  $result = $dataClass::update($this->primary, $data);
303 
304  // check for error
305  if (!$result->isSuccess())
306  {
307  return $result;
308  }
309  }
310  }
311 
312  // changed collections
313  $this->sysSaveRelations($result);
314 
315  // return if there were errors
316  if (!$result->isSuccess())
317  {
318  return $result;
319  }
320 
321  $this->sysPostSave();
322 
323  return $result;
324  }

◆ wakeUp()

static wakeUp (   $row)
staticfinal

Constructs existing object from pre-selected data, including references and relations.

Аргументы
mixed$rowArray of [field => value] or single scalar primary value.
Возвращает
static
Исключения
ArgumentException
SystemException

См. определение в файле entityobject.php строка 414

415  {
416  /** @var static $objectClass */
417  $objectClass = get_called_class();
418 
419  /** @var \Bitrix\Main\ORM\Data\DataManager $dataClass */
420  $dataClass = static::$dataClass;
421 
422  $entity = $dataClass::getEntity();
423  $entityPrimary = $entity->getPrimaryArray();
424 
425  // normalize input data and primary
426  $primary = [];
427 
428  if (!is_array($row))
429  {
430  // it could be single primary
431  if (count($entityPrimary) == 1)
432  {
433  $primary[$entityPrimary[0]] = $row;
434  $row = [];
435  }
436  else
437  {
438  throw new ArgumentException(sprintf(
439  'Multi-primary for %s was not found', $objectClass
440  ));
441  }
442  }
443  else
444  {
445  foreach ($entityPrimary as $primaryName)
446  {
447  if (!isset($row[$primaryName]))
448  {
449  throw new ArgumentException(sprintf(
450  'Primary %s for %s was not found', $primaryName, $objectClass
451  ));
452  }
453 
454  $primary[$primaryName] = $row[$primaryName];
455  unset($row[$primaryName]);
456  }
457  }
458 
459  // create object
460  /** @var static $object */
461  $object = new $objectClass(false); // here go with false to not set default values
462  $object->sysChangeState(State::ACTUAL);
463 
464  // set primary
465  foreach ($primary as $primaryName => $primaryValue)
466  {
467  /** @var ScalarField $primaryField */
468  $primaryField = $entity->getField($primaryName);
469  $object->sysSetActual($primaryName, $primaryField->cast($primaryValue));
470  }
471 
472  // set other data
473  foreach ($row as $fieldName => $value)
474  {
475  /** @var ScalarField $primaryField */
476  $field = $entity->getField($fieldName);
477 
478  if ($field instanceof IReadable)
479  {
480  $object->sysSetActual($fieldName, $field->cast($value));
481  }
482  else
483  {
484  // we have a relation
485  if ($value instanceof static || $value instanceof Collection)
486  {
487  // it is ready data
488  $object->sysSetActual($fieldName, $value);
489  }
490  else
491  {
492  // wake up relation
493  if ($field instanceof Reference)
494  {
495  // wake up an object
496  $remoteObjectClass = $field->getRefEntity()->getObjectClass();
497  $remoteObject = $remoteObjectClass::wakeUp($value);
498 
499  $object->sysSetActual($fieldName, $remoteObject);
500  }
501  elseif ($field instanceof OneToMany || $field instanceof ManyToMany)
502  {
503  // wake up collection
504  $remoteCollectionClass = $field->getRefEntity()->getCollectionClass();
505  $remoteCollection = $remoteCollectionClass::wakeUp($value);
506 
507  $object->sysSetActual($fieldName, $remoteCollection);
508  }
509  }
510  }
511  }
512 
513  return $object;
514  }

Поля

◆ $_actualValues

$_actualValues = []
protected

См. определение в файле entityobject.php строка 68

◆ $_authContext

$_authContext
protected

См. определение в файле entityobject.php строка 91

◆ $_camelToSnakeCache

$_camelToSnakeCache = []
staticprotected

См. определение в файле entityobject.php строка 97

◆ $_currentValues

$_currentValues = []
protected

См. определение в файле entityobject.php строка 74

◆ $_customData

$_customData = null
protected

См. определение в файле entityobject.php строка 85

◆ $_entity

$_entity
protected

См. определение в файле entityobject.php строка 56

◆ $_onPrimarySetListeners

$_onPrimarySetListeners = []
protected

См. определение в файле entityobject.php строка 88

◆ $_runtimeValues

$_runtimeValues = []
protected

См. определение в файле entityobject.php строка 80

◆ $_snakeToCamelCache

$_snakeToCamelCache = []
staticprotected

См. определение в файле entityobject.php строка 103

◆ $_state

$_state = State::RAW
protected

См. определение в файле entityobject.php строка 62

◆ $dataClass

$dataClass
static

См. определение в файле entityobject.php строка 53


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