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

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

 __construct ($setDefaultValues=true)
 EntityObject constructor. Подробнее...
 
 collectValues ($valuesType=Values::ALL, $fieldsMask=FieldTypeMask::ALL)
 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
 

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

 $_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  }

Методы

◆ collectValues()

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

Returns all objects values as an array.

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

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

155  {
156  switch ($valuesType)
157  {
158  case Values::ACTUAL:
159  $objectValues = $this->_actualValues;
160  break;
161  case Values::CURRENT:
162  $objectValues = $this->_currentValues;
163  break;
164  default:
165  $objectValues = array_merge($this->_actualValues, $this->_currentValues);
166  }
167 
168  // filter with field mask
169  if ($fieldsMask !== FieldTypeMask::ALL)
170  {
171  foreach ($objectValues as $fieldName => $value)
172  {
173  $fieldMask = $this->entity->getField($fieldName)->getTypeMask();
174  if (!($fieldsMask & $fieldMask))
175  {
176  unset($objectValues[$fieldName]);
177  }
178  }
179  }
180 
181  // remap from uppercase to real field names
182  $values = [];
183 
184  foreach ($objectValues as $k => $v)
185  {
186  $values[$this->entity->getField($k)->getName()] = $v;
187  }
188 
189  return $values;
190  }

◆ delete()

delete ( )
final

ActiveRecord delete.

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

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

282  {
283  $result = new Result;
284 
285  // delete relations
286  foreach ($this->entity->getFields() as $field)
287  {
288  if ($field instanceof Reference)
289  {
290  if ($field->getCascadeDeletePolicy() === CascadePolicy::FOLLOW)
291  {
292  /** @var EntityObject $remoteObject */
293  $remoteObject = $this->sysGetValue($field->getName());
294  $remoteObject->delete();
295  }
296  }
297  elseif ($field instanceof OneToMany)
298  {
299  if ($field->getCascadeDeletePolicy() === CascadePolicy::FOLLOW)
300  {
301  // delete
302  $collection = $this->sysFillRelationCollection($field);
303 
304  foreach ($collection as $object)
305  {
306  $object->delete();
307  }
308  }
309  elseif ($field->getCascadeDeletePolicy() === CascadePolicy::SET_NULL)
310  {
311  // set null
312  $this->sysRemoveAllFromCollection($field->getName());
313  }
314  }
315  elseif ($field instanceof ManyToMany)
316  {
317  if ($field->getCascadeDeletePolicy() === CascadePolicy::FOLLOW_ORPHANS)
318  {
319  // delete
320  }
321  elseif ($field->getCascadeDeletePolicy() === CascadePolicy::SET_NULL)
322  {
323  // set null
324  }
325 
326  // always delete mediator records
327  $this->sysRemoveAllFromCollection($field->getName());
328  }
329  }
330 
331  $this->sysSaveRelations($result);
332 
333  // delete object itself
334  $dataClass = static::$dataClass;
335  $deleteResult = $dataClass::delete($this->primary);
336 
337  if (!$deleteResult->isSuccess())
338  {
339  $result->addErrors($deleteResult->getErrors());
340  }
341 
342  // clear status
343  foreach ($this->entity->getPrimaryArray()as $primaryName)
344  {
345  unset($this->_actualValues[$primaryName]);
346  }
347 
348  $this->sysChangeState(State::DELETED);
349 
350  return $result;
351  }

◆ 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 строка 473

474  {
475  // object must have primary
476  $primaryFilter = Query::filter();
477 
478  foreach ($this->sysRequirePrimary() as $primaryName => $primaryValue)
479  {
480  $primaryFilter->where($primaryName, $primaryValue);
481  }
482 
483  // collect fields to be selected
484  if (is_array($fields))
485  {
486  // go through IDLE fields
487  $fieldsToSelect = $this->sysGetIdleFields($fields);
488  }
489  elseif (is_scalar($fields) && !is_numeric($fields))
490  {
491  // one custom field
492  $fields = [$fields];
493  $fieldsToSelect = $this->sysGetIdleFields($fields);
494  }
495  else
496  {
497  // get fields according to selector mask
498  $fieldsToSelect = $this->sysGetIdleFieldsByMask($fields);
499  }
500 
501  if (!empty($fieldsToSelect))
502  {
503  $fieldsToSelect = array_merge($this->entity->getPrimaryArray(), $fieldsToSelect);
504 
505  // build query
506  $dataClass = $this->entity->getDataClass();
507  $result = $dataClass::query()->setSelect($fieldsToSelect)->where($primaryFilter)->exec();
508 
509  // set object to identityMap of result, and it will be partially completed by fetch
510  $im = new IdentityMap;
511  $im->put($this);
512 
513  $result->setIdentityMap($im);
514  $result->fetchObject();
515 
516  // set filled flag to collections
517  foreach ($fieldsToSelect as $fieldName)
518  {
519  // check field before continue, it could be remote REF.ID definition so we skip it here
520  if ($this->entity->hasField($fieldName))
521  {
522  $field = $this->entity->getField($fieldName);
523 
524  if ($field instanceof OneToMany || $field instanceof ManyToMany)
525  {
526  /** @var Collection $collection */
527  $collection = $this->sysGetValue($fieldName);
528 
529  if (empty($collection))
530  {
531  $collection = $field->getRefEntity()->createCollection();
532  $this->_actualValues[$fieldName] = $collection;
533  }
534 
535  $collection->sysSetFilled();
536  }
537  }
538  }
539  }
540 
541  // return field value it it was only one
542  if (is_array($fields) && count($fields) == 1 && $this->entity->hasField(current($fields)))
543  {
544  return $this->sysGetValue(current($fields));
545  }
546 
547  return null;
548  }

◆ get()

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

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

586  {
587  return $this->__call(__FUNCTION__, func_get_args());
588  }

◆ getId()

getId ( )

Fast popular alternative to __call().

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

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

557  {
558  if (array_key_exists('ID', $this->_currentValues))
559  {
560  return $this->_currentValues['ID'];
561  }
562  elseif (array_key_exists('ID', $this->_actualValues))
563  {
564  return $this->_actualValues['ID'];
565  }
566  elseif (!$this->entity->hasField('ID'))
567  {
568  throw new SystemException(sprintf(
569  'Unknown method `%s` for object `%s`', 'getId', get_called_class()
570  ));
571  }
572  else
573  {
574  return null;
575  }
576  }

◆ remindActual()

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

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

598  {
599  return $this->__call(__FUNCTION__, func_get_args());
600  }

◆ save()

save ( )
final

ActiveRecord save.

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

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

201  {
202  // default empty result
203  switch ($this->state)
204  {
205  case State::RAW:
206  $result = new AddResult;
207  break;
208  case State::CHANGED:
209  case State::ACTUAL:
210  $result = new UpdateResult;
211  break;
212  default:
213  $result = new Result;
214  }
215 
216  $dataClass = $this->entity->getDataClass();
217 
218  if ($this->_state == State::RAW)
219  {
220  $data = $this->_currentValues;
221  $data['__object'] = $this;
222 
223  // put secret key __object to array
224  $result = $dataClass::add($data);
225 
226  // check for error
227  if (!$result->isSuccess())
228  {
229  return $result;
230  }
231 
232  // set primary
233  foreach ($result->getPrimary() as $primaryName => $primaryValue)
234  {
235  $this->sysSetActual($primaryName, $primaryValue);
236  }
237 
238  // on primary gain event
239  $this->sysOnPrimarySet();
240  }
241  elseif ($this->_state == State::CHANGED)
242  {
243  // changed scalar and reference
244  if (!empty($this->_currentValues))
245  {
246  $data = $this->_currentValues;
247  $data['__object'] = $this;
248 
249  // put secret key __object to array
250  $result = $dataClass::update($this->primary, $data);
251 
252  // check for error
253  if (!$result->isSuccess())
254  {
255  return $result;
256  }
257  }
258  }
259 
260  // changed collections
261  $this->sysSaveRelations($result);
262 
263  // return if there were errors
264  if (!$result->isSuccess())
265  {
266  return $result;
267  }
268 
269  $this->sysPostSave();
270 
271  return $result;
272  }

◆ 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 строка 362

363  {
364  /** @var static $objectClass */
365  $objectClass = get_called_class();
366 
367  /** @var \Bitrix\Main\ORM\Data\DataManager $dataClass */
368  $dataClass = static::$dataClass;
369 
370  $entity = $dataClass::getEntity();
371  $entityPrimary = $entity->getPrimaryArray();
372 
373  // normalize input data and primary
374  $primary = [];
375 
376  if (!is_array($row))
377  {
378  // it could be single primary
379  if (count($entityPrimary) == 1)
380  {
381  $primary[$entityPrimary[0]] = $row;
382  $row = [];
383  }
384  else
385  {
386  throw new ArgumentException(sprintf(
387  'Multi-primary for %s was not found', $objectClass
388  ));
389  }
390  }
391  else
392  {
393  foreach ($entityPrimary as $primaryName)
394  {
395  if (!isset($row[$primaryName]))
396  {
397  throw new ArgumentException(sprintf(
398  'Primary %s for %s was not found', $primaryName, $objectClass
399  ));
400  }
401 
402  $primary[$primaryName] = $row[$primaryName];
403  unset($row[$primaryName]);
404  }
405  }
406 
407  // create object
408  /** @var static $object */
409  $object = new $objectClass(false); // here go with false to not set default values
410  $object->sysChangeState(State::ACTUAL);
411 
412  // set primary
413  foreach ($primary as $primaryName => $primaryValue)
414  {
415  /** @var ScalarField $primaryField */
416  $primaryField = $entity->getField($primaryName);
417  $object->sysSetActual($primaryName, $primaryField->cast($primaryValue));
418  }
419 
420  // set other data
421  foreach ($row as $fieldName => $value)
422  {
423  /** @var ScalarField $primaryField */
424  $field = $entity->getField($fieldName);
425 
426  if ($field instanceof IReadable)
427  {
428  $object->sysSetActual($fieldName, $field->cast($value));
429  }
430  else
431  {
432  // we have a relation
433  if ($value instanceof static || $value instanceof Collection)
434  {
435  // it is ready data
436  $object->sysSetActual($fieldName, $value);
437  }
438  else
439  {
440  // wake up relation
441  if ($field instanceof Reference)
442  {
443  // wake up an object
444  $remoteObjectClass = $field->getRefEntity()->getObjectClass();
445  $remoteObject = $remoteObjectClass::wakeUp($value);
446 
447  $object->sysSetActual($fieldName, $remoteObject);
448  }
449  elseif ($field instanceof OneToMany || $field instanceof ManyToMany)
450  {
451  // wake up collection
452  $remoteCollectionClass = $field->getRefEntity()->getCollectionClass();
453  $remoteCollection = $remoteCollectionClass::wakeUp($value);
454 
455  $object->sysSetActual($fieldName, $remoteCollection);
456  }
457  }
458  }
459  }
460 
461  return $object;
462  }

Поля

◆ $_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


Объявления и описания членов класса находятся в файле:
Bitrix\Main\ORM\Fields\Relations\CascadePolicy\SET_NULL
const SET_NULL
Definition: cascadepolicy.php:19
Bitrix\Main\ORM\Fields\FieldTypeMask\ALL
const ALL
Definition: fieldtypemask.php:27
Bitrix\Main\ORM\Objectify\EntityObject\$_currentValues
$_currentValues
Definition: entityobject.php:74
Bitrix\Main\ORM\Objectify\State\RAW
const RAW
Definition: main/lib/orm/objectify/state.php:18
Bitrix\Main\ORM\Objectify\State\CHANGED
const CHANGED
Definition: main/lib/orm/objectify/state.php:20
Bitrix\Main\ORM\Query\Query\filter
static filter()
Returns new instance of Filter.
Definition: main/lib/orm/query/query.php:756
Bitrix\Main\ORM\Objectify\EntityObject\$dataClass
static $dataClass
Definition: entityobject.php:53
Bitrix\Main\ORM\Objectify\EntityObject\$_actualValues
$_actualValues
Definition: entityobject.php:68
Bitrix\Main\ORM\Objectify\State\ACTUAL
const ACTUAL
Definition: main/lib/orm/objectify/state.php:19
Bitrix\Main\ORM\Objectify\Values\CURRENT
const CURRENT
Definition: values.php:19
Bitrix\Main\ORM\Fields\Relations\CascadePolicy\FOLLOW
const FOLLOW
Definition: cascadepolicy.php:21
Bitrix\Main\ORM\Fields\Relations\CascadePolicy\FOLLOW_ORPHANS
const FOLLOW_ORPHANS
Definition: cascadepolicy.php:23
Bitrix\Main\ORM\Objectify\State\DELETED
const DELETED
Definition: main/lib/orm/objectify/state.php:21
Bitrix\Main\ORM\Objectify\Values\ACTUAL
const ACTUAL
Definition: values.php:18