core-bundle/src/Resources/contao/library/Contao/Model.php
public function getRelated($strKey, array $arrOptions=array())
	{
		// The related model has been loaded before
		if (\array_key_exists($strKey, $this->arrRelated))
		{
			return $this->arrRelated[$strKey];
		}

		// The relation does not exist
		if (!isset($this->arrRelations[$strKey]))
		{
			throw new \Exception("Field $strKey does not seem to be related");
		}

		// The relation exists but there is no reference yet (see #6161 and #458)
		if (empty($this->$strKey))
		{
			return null;
		}

		$arrRelation = $this->arrRelations[$strKey];

		/** @var static $strClass */
		$strClass = static::getClassFromTable($arrRelation['table']);

		// Load the related record(s)
		if ($arrRelation['type'] == 'hasOne' || $arrRelation['type'] == 'belongsTo')
		{
			$this->arrRelated[$strKey] = $strClass::findOneBy($arrRelation['field'], $this->$strKey, $arrOptions);;
		}
		elseif ($arrRelation['type'] == 'hasMany' || $arrRelation['type'] == 'belongsToMany')
		{
			if (isset($arrRelation['delimiter']))
			{
				$arrValues = StringUtil::trimsplit($arrRelation['delimiter'], $this->$strKey);
			}
			else
			{
				$arrValues = StringUtil::deserialize($this->$strKey, true);
			}

			$objModel = null;

			if (\is_array($arrValues))
			{
				// Handle UUIDs (see #6525 and #8850)
				if ($arrRelation['table'] == 'tl_files' && $arrRelation['field'] == 'uuid')
				{
					/** @var FilesModel $strClass */
					$objModel = $strClass::findMultipleByUuids($arrValues, $arrOptions);
				}
				else
				{
					$strField = $arrRelation['table'] . '.' . Database::quoteIdentifier($arrRelation['field']);

					$arrOptions = array_merge
					(
						array
						(
							'order' => Database::getInstance()->findInSet($strField, $arrValues)
						),
						$arrOptions
					);

					$objModel = $strClass::findBy(array($strField . " IN('" . implode("','", $arrValues) . "')"), null, $arrOptions);
				}
			}

			$this->arrRelated[$strKey] = $objModel;
		}

		return $this->arrRelated[$strKey];
	}
public function getRelated($strKey, array $arrOptions=array())
	{
		// The related model has been loaded before
		if (\array_key_exists($strKey, $this->arrRelated))
		{
			return $this->arrRelated[$strKey];
		}

		// The relation does not exist
		if (!isset($this->arrRelations[$strKey]))
		{
			throw new \Exception("Field $strKey does not seem to be related");
		}

		// The relation exists but there is no reference yet (see #6161 and #458)
		if (empty($this->$strKey))
		{
			return null;
		}

		$arrRelation = $this->arrRelations[$strKey];

		/** @var static $strClass */
		$strClass = static::getClassFromTable($arrRelation['table']);

		// Load the related record(s)
		if ($arrRelation['type'] == 'hasOne' || $arrRelation['type'] == 'belongsTo')
		{
			$this->arrRelated[$strKey] = $strClass::findOneBy($arrRelation['field'], $this->$strKey, $arrOptions);;
		}
		elseif ($arrRelation['type'] == 'hasMany' || $arrRelation['type'] == 'belongsToMany')
		{
			if (isset($arrRelation['delimiter']))
			{
				$arrValues = StringUtil::trimsplit($arrRelation['delimiter'], $this->$strKey);
			}
			else
			{
				$arrValues = StringUtil::deserialize($this->$strKey, true);
			}

			$objModel = null;

			if (\is_array($arrValues))
			{
				// Handle UUIDs (see #6525 and #8850)
				if ($arrRelation['table'] == 'tl_files' && $arrRelation['field'] == 'uuid')
				{
					/** @var FilesModel $strClass */
					$objModel = $strClass::findMultipleByUuids($arrValues, $arrOptions);
				}
				else
				{
					$strField = $arrRelation['table'] . '.' . Database::quoteIdentifier($arrRelation['field']);

					$arrOptions = array_merge
					(
						array
						(
							'order' => Database::getInstance()->findInSet($strField, $arrValues)
						),
						$arrOptions
					);

					$objModel = $strClass::findBy(array($strField . " IN('" . implode("','", $arrValues) . "')"), null, $arrOptions);
				}
			}

			$this->arrRelated[$strKey] = $objModel;
		}

		return $this->arrRelated[$strKey];
	}
public function getRelated ( $ strKey , array $ arrOptions = array ( ) ) { // The related model has been loaded before if ( \ array_key_exists ( $ strKey , $ this -> arrRelated ) ) { return $ this -> arrRelated [ $ strKey ] ; } // The relation does not exist if ( ! isset ( $ this -> arrRelations [ $ strKey ] ) ) { throw new \ Exception ( "Field $strKey does not seem to be related" ) ; } // The relation exists but there is no reference yet (see #6161 and #458) if ( empty ( $ this -> $ strKey ) ) { return null ; } $ arrRelation = $ this -> arrRelations [ $ strKey ] ; /** @var static $strClass */ $ strClass = static :: getClassFromTable ( $ arrRelation [ 'table' ] ) ; // Load the related record(s) if ( $ arrRelation [ 'type' ] == 'hasOne' || $ arrRelation [ 'type' ] == 'belongsTo' ) { $ this -> arrRelated [ $ strKey ] = $ strClass :: findOneBy ( $ arrRelation [ 'field' ] , $ this -> $ strKey , $ arrOptions ) ; ; } elseif ( $ arrRelation [ 'type' ] == 'hasMany' || $ arrRelation [ 'type' ] == 'belongsToMany' ) { if ( isset ( $ arrRelation [ 'delimiter' ] ) ) { $ arrValues = StringUtil :: trimsplit ( $ arrRelation [ 'delimiter' ] , $ this -> $ strKey ) ; } else { $ arrValues = StringUtil :: deserialize ( $ this -> $ strKey , true ) ; } $ objModel = null ; if ( \ is_array ( $ arrValues ) ) { // Handle UUIDs (see #6525 and #8850) if ( $ arrRelation [ 'table' ] == 'tl_files' && $ arrRelation [ 'field' ] == 'uuid' ) { /** @var FilesModel $strClass */ $ objModel = $ strClass :: findMultipleByUuids ( $ arrValues , $ arrOptions ) ; } else { $ strField = $ arrRelation [ 'table' ] . '.' . Database :: quoteIdentifier ( $ arrRelation [ 'field' ] ) ; $ arrOptions = array_merge ( array ( 'order' => Database :: getInstance ( ) -> findInSet ( $ strField , $ arrValues ) ) , $ arrOptions ) ; $ objModel = $ strClass :: findBy ( array ( $ strField . " IN('" . implode ( "','" , $ arrValues ) . "')" ) , null , $ arrOptions ) ; } } $ this -> arrRelated [ $ strKey ] = $ objModel ; } return $ this -> arrRelated [ $ strKey ] ; }
Lazy load related records

@param string $strKey     The property name
@param array  $arrOptions An optional options array

@return static|Collection|null The model or a model collection if there are multiple rows

@throws \Exception If $strKey is not a related field
Lazy load related records