/** * Create a relationship from an annotation * * @param string $name * @param RelationshipType $type * @param AbstractRelationshipAnnotation $annotation * @return Relationship */ private function createRelationship($name, RelationshipType $type, AbstractRelationshipAnnotation $annotation) { $target = new AnnotationMetadataParser($annotation->target); $relationship = new Relationship($name, $type); $relationship->setSource($this->reflection_obj->name)->setTarget($annotation->target)->setSourceTable($this->getTableName())->setTargetTable($target->getTableName())->setGetter($annotation->getter)->setSetter($annotation->setter)->setInversedBy($annotation->inversed_by); if ($annotation instanceof AbstractSortableRelationshipAnnotation && $annotation->sortable_by) { $sortables = []; foreach ($annotation->sortable_by as $sortable) { if ($sortable instanceof SortableAnnotation) { $conditions = []; foreach ($sortable->conditions as $condition) { if ($condition instanceof ConditionAnnotation) { $this->testConditionAnnotation($condition); $conditions[] = new Condition($condition->column, $condition->method, $condition->value, $condition->comparison); } else { throw new UnexpectedValueException(self::ERR_UNKNOWN_CONDITION); } } $sortables[] = new Sortable($sortable->column, $conditions, $sortable->name); } elseif (is_string($sortable)) { $sortables[] = new Sortable($sortable); } else { throw new UnexpectedValueException(self::ERR_UNKNOWN_SORTABLE); } } $relationship->setSortableBy($sortables); } return $relationship; }