Your IP : 172.69.7.234


Current Path : /var/www/element/data/www/revenuestory.ru/bitrix/modules/main/lib/orm/fields/relations/
Upload File :
Current File : /var/www/element/data/www/revenuestory.ru/bitrix/modules/main/lib/orm/fields/relations/relation.php

<?php
/**
 * Bitrix Framework
 * @package    bitrix
 * @subpackage main
 * @copyright  2001-2018 Bitrix
 */

namespace Bitrix\Main\ORM\Fields\Relations;

use Bitrix\Main\ArgumentException;
use Bitrix\Main\ORM\Fields\ITypeHintable;
use Bitrix\Main\SystemException;
use Bitrix\Main\ORM\Entity;
use Bitrix\Main\ORM\Fields\Field;
use Bitrix\Main\ORM\Objectify\EntityObject;
use Bitrix\Main\ORM\Query\Join;

/**
 * Performs relation mapping: back-reference and many-to-many relations.
 *
 * @package    bitrix
 * @subpackage main
 */
abstract class Relation extends Field implements ITypeHintable
{
	/** @var string Name of target entity */
	protected $refEntityName;

	/** @var Entity Target entity */
	protected $refEntity;

	/** @var string */
	protected $joinType = null;

	/** @var int */
	protected $cascadeSavePolicy;

	/** @var int */
	protected $cascadeDeletePolicy;

	/**
	 * @param int $cascadeSavePolicy
	 *
	 * @return Relation
	 */
	public function configureCascadeSavePolicy($cascadeSavePolicy)
	{
		$this->cascadeSavePolicy = $cascadeSavePolicy;

		return $this;
	}

	/**
	 * @param int $cascadeDeletePolicy
	 *
	 * @return Relation
	 */
	public function configureCascadeDeletePolicy($cascadeDeletePolicy)
	{
		$this->cascadeDeletePolicy = $cascadeDeletePolicy;

		return $this;
	}

	/**
	 * @return Entity
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws SystemException
	 */
	public function getRefEntity()
	{
		if ($this->refEntity === null)
		{
			// refEntityName could be an object or a data class
			if (class_exists($this->refEntityName) && is_subclass_of($this->refEntityName, EntityObject::class))
			{
				/** @var EntityObject $refObjectClass */
				$refObjectClass = $this->refEntityName;
				$this->refEntityName = $refObjectClass::$dataClass;
			}

			$this->refEntity = Entity::getInstance($this->refEntityName);
		}

		return $this->refEntity;
	}

	/**
	 * @return string
	 */
	public function getRefEntityName()
	{
		return $this->refEntityName;
	}

	/**
	 * @param $type
	 *
	 * @return $this
	 * @throws ArgumentException
	 */
	public function configureJoinType($type)
	{
		$type = strtoupper($type);

		if (!in_array($type, Join::getTypes(), true))
		{
			throw new ArgumentException(sprintf(
				'Unknown join type `%s` in reference `%s` of `%s` entity',
				$type, $this->name, $this->entity->getDataClass()
			));
		}

		$this->joinType = $type;

		return $this;
	}

	/**
	 * @return string
	 */
	public function getJoinType()
	{
		return $this->joinType;
	}

	/**
	 * @return int
	 */
	public function getCascadeSavePolicy()
	{
		return $this->cascadeSavePolicy;
	}

	/**
	 * @return int
	 */
	public function getCascadeDeletePolicy()
	{
		return $this->cascadeDeletePolicy;
	}

	/**
	 * @return EntityObject|string
	 * @throws ArgumentException
	 * @throws SystemException
	 */
	public function getGetterTypeHint()
	{
		return $this->getRefEntity()->getObjectClass();
	}

	/**
	 * @return EntityObject|string
	 * @throws ArgumentException
	 * @throws SystemException
	 */
	public function getSetterTypeHint()
	{
		return $this->getRefEntity()->getObjectClass();
	}
}