/** * * Get model properties as array. * return array */ public function getData() { $data = array(); $data['id'] = $this->model->id; $retrievableAttributes = static::resolveRetrievableAttributesByModel($this->model); foreach ($this->model->getAttributes($retrievableAttributes) as $attributeName => $notUsed) { $type = ModelAttributeToMixedArrayTypeUtil::getType($this->model, $attributeName); $adapterClassName = $type . 'RedBeanModelAttributeValueToArrayValueAdapter'; if ($type != null && @class_exists($adapterClassName) && !($this->model->isRelation($attributeName) && $this->model->getRelationType($attributeName) != RedBeanModel::HAS_ONE)) { $adapter = new $adapterClassName($this->model, $attributeName); $adapter->resolveData($data); } elseif ($this->model->isOwnedRelation($attributeName) && ($this->model->getRelationType($attributeName) == RedBeanModel::HAS_ONE || $this->model->getRelationType($attributeName) == RedBeanModel::HAS_MANY_BELONGS_TO)) { if ($this->model->{$attributeName}->id > 0) { $util = new ModelToArrayAdapter($this->model->{$attributeName}); $relatedData = $util->getData(); $data[$attributeName] = $relatedData; } else { $data[$attributeName] = null; } } elseif ($this->model->isRelation($attributeName) && $this->model->getRelationType($attributeName) == RedBeanModel::HAS_ONE) { if ($this->model->{$attributeName}->id > 0) { $data[$attributeName] = array('id' => $this->model->{$attributeName}->id); } else { $data[$attributeName] = null; } } } return $data; }
/** * @param string $relation * @return bool * @throws NotSupportedException if the relation string is malformed */ public function isRelationASingularRelation($relation) { assert('is_string($relation)'); $delimiter = FormModelUtil::DELIMITER; $relationAndInferredData = explode($delimiter, $relation); $derivedRelations = $this->getDerivedRelationsViaCastedUpModelData(); if (count($relationAndInferredData) == 3) { list($modelClassName, $relation, $notUsed) = $relationAndInferredData; $type = $this->model->getRelationType($relation); } elseif (count($relationAndInferredData) == 2) { list($relation, $notUsed) = $relationAndInferredData; $type = $this->model->getRelationType($relation); } elseif (count($relationAndInferredData) == 1 && isset($derivedRelations[$relation])) { $type = $this->model->getDerivedRelationType($relation); } elseif (count($relationAndInferredData) == 1) { $type = $this->model->getRelationType($relation); } else { throw new NotSupportedException(); } if ($type == RedBeanModel::HAS_ONE || $type == RedBeanModel::HAS_ONE_BELONGS_TO || $type == RedBeanModel::HAS_MANY_BELONGS_TO) { return true; } return false; }
public static function getHasManyOpposingRelationName(RedBeanModel $model, $precedingModelClassName, $precedingRelation) { assert('is_string($precedingModelClassName)'); assert('is_string($precedingRelation)'); foreach ($model->attributeNames() as $attributeName) { if ($model->isRelation($attributeName) && ($model->getRelationType($attributeName) == RedBeanModel::HAS_ONE || $model->getRelationType($attributeName) == RedBeanModel::HAS_MANY_BELONGS_TO) && static::relationLinksToPrecedingRelation(get_class($model), $attributeName, $precedingModelClassName, $precedingRelation)) { return $attributeName; } } }
/** * @param RedBeanModel $model * @param array $modelRelations * @return bool * @throws ApiException */ protected function manageModelRelations($model, $modelRelations) { try { if (isset($modelRelations) && !empty($modelRelations)) { foreach ($modelRelations as $modelRelation => $relations) { if ($model->isAttribute($modelRelation) && ($model->getRelationType($modelRelation) == RedBeanModel::HAS_MANY || $model->getRelationType($modelRelation) == RedBeanModel::MANY_MANY)) { foreach ($relations as $relation) { $relatedModelClassName = $relation['modelClassName']; try { $relatedModel = $relatedModelClassName::getById(intval($relation['modelId'])); } catch (Exception $e) { $message = Zurmo::t('ZurmoModule', 'The related model ID specified was invalid.'); throw new NotFoundException($message); } if ($relation['action'] == 'add') { $model->{$modelRelation}->add($relatedModel); } elseif ($relation['action'] == 'remove') { $model->{$modelRelation}->remove($relatedModel); } else { $message = Zurmo::t('ZurmoModule', 'Unsupported action.'); throw new NotSupportedException($message); } } } else { $message = Zurmo::t('ZurmoModule', 'You can add relations only for HAS_MANY and MANY_MANY relations.'); throw new NotSupportedException($message); } } } } catch (Exception $e) { $message = $e->getMessage(); throw new ApiException($message); } return true; }