/** * @param Model|ModelCollection $caller * @return array|null */ public static function getIDs($caller) { return $caller instanceof Model ? array($caller->getID()) : $caller->getIDs(); }
/** * @param Model|ModelCollection $caller */ protected function loadAbilitiesForCaller($caller) { $files = $caller->_getStructure()->getAbilityInfo('files'); if (!empty($files)) { foreach (array_keys($files) as $fileAlias) { $getterName = 'get' . Inflector::classify($fileAlias); if ($caller instanceof Model) { $caller = array($caller); } foreach ($caller as $object) { $object->{$getterName}(); } } } }
/** * @param Model|ModelCollection $caller * @param $relationName * @return $this * @throws \Exception */ public function _loadRelated($caller, $relationName) { /** * @var $localKey * @var $localField * @var $foreignKey * @var $foreignField * @var $localTable * @var $foreignTable * @var $manyTable * @var $relationType * @var $relatedModelName * @var $hydration * @var $fieldsToRetrieve * @var $relationToMany */ $varsToExport = ModelOperator::calculateRelationVariables($caller->_getName(), $relationName); extract($varsToExport); $foreignIds = array(); $idsMap = array(); $originalCaller = null; if ($caller instanceof Model && $caller->_hasCollectionReference()) { $caller = $caller->_getCollectionReference(); } if ($relationType == 'many_to_one') { $foreignIds = ModelOperator::getFieldArray($caller, $localField); } elseif ($relationToMany) { $localIds = ModelOperator::getIDs($caller); $tableToSelect = $foreignTable; $fieldToSelect = $foreignKey; if ($relationType == 'many_to_many') { $tableToSelect = $manyTable; $fieldToSelect = $localField; } $idsMap = QC::create($tableToSelect)->where(array($tableToSelect . '.' . $foreignField => $localIds))->select($fieldToSelect . ', ' . $foreignField)->foldBy($foreignField)->use($fieldToSelect)->execute(); foreach ($idsMap as $value) { $foreignIds = array_merge($foreignIds, $value); } } $foreignIds = array_unique($foreignIds); if (empty($foreignIds)) { return false; } elseif ($foreignKey == 'id') { $ids = array(); foreach ($foreignIds as $key => $value) { $ids[] = intval($value); } $foreignIds = $ids; } /** * @var ModelCollection $relatedCollection */ $relatedCollection = call_user_func(array($relatedModelName, 'loadList'), $foreignIds); $callerObjects = $caller instanceof ModelCollection ? $caller : array($caller); /** * @var Model $object */ foreach ($callerObjects as $object) { if (substr($relationType, '-6') == 'to_one') { $relationValue = $relatedCollection->getOneByPK($object[$localField]); } else { $relationValue = $relatedCollection->getSubCollectionByPKs($idsMap[$object->getID()]); } $object->_setRawFieldValue($relationName, $relationValue); } return $this; }