/** * Adds a belongs to field to the statement * @param zibo\library\orm\definition\field\BelongsToField $field * @return null; */ private function addBelongsTo(BelongsToField $field) { $name = $field->getName(); $relationModel = $this->meta->getRelationModel($name); $hasRelations = $relationModel->getMeta()->hasRelations(); $useJoin = false; if ($this->recursiveDepth === 1 || $this->recursiveDepth !== 0 && !$hasRelations) { $useJoin = true; } if (!$useJoin && ($this->recursiveDepth === null || $this->recursiveDepth > 1)) { $this->recursiveBelongsToFields[$name] = $field; } if (!$useJoin) { if ($field->isLocalized()) { $this->addField($this->tables[self::ALIAS_SELF_LOCALIZED], $name); $this->localize = true; } else { $this->addField($this->tables[self::ALIAS_SELF], $name); } return; } $this->addFieldJoin($field); $relationTable = $this->meta->getRelationTable($name); $relationLocalizedTable = $this->meta->getRelationLocalizedTable($name); $relationFields = $this->meta->getRelationFields($name); foreach ($relationFields as $relationField) { if ($relationField instanceof HasField) { continue; } if ($relationField->isLocalized()) { $this->addField($relationLocalizedTable, $relationField->getName(), $name); } else { $this->addField($relationTable, $relationField->getName(), $name); } } }
/** * @expectedException zibo\library\orm\exception\OrmException */ public function testRegisterModelWithLocalizationDoesntRegisterLocalizedLinkModelWhenBothLinksAreLocalized() { $field1 = new HasManyField('field1', 'Model2'); $field1->setIsLocalized(true); $model1 = $this->createModel('model1', array($field1)); $field2 = new BelongsToField('field2', 'Model1'); $field2->setIsLocalized(true); $model2 = $this->createModel('model2', array($field2)); $this->register->registerModel($model1); $this->register->registerModel($model2); $localizedModel = $this->register->getModel('model1' . LocalizedModel::MODEL_SUFFIX . 'model2'); }
/** * Parses a belongs to field in the meta * @param zibo\library\orm\definition\field\BelongsToField $field * @return null * @param zibo\library\orm\ModelManager $modelManager Instance of the model manager */ private function parseBelongsToField(BelongsToField $field, ModelManager $modelManager) { $name = $field->getName(); $modelName = $this->getName(); $relationModelName = $field->getRelationModelName(); try { $relationModel = $modelManager->getModel($relationModelName); } catch (OrmException $exception) { throw new ModelException('No relation model found for field ' . $name . ' in ' . $modelName); } $relation = new RelationMeta(); $relation->setIsRelationWithSelf($relationModelName == $modelName); $this->relations[$name] = $relation; $this->belongsTo[$name] = $field; $relationFields = $relationModel->getMeta()->getRelation($modelName); if (!$relationFields[ModelTable::BELONGS_TO] && !$relationFields[ModelTable::HAS_MANY] && !$relationFields[ModelTable::HAS_ONE]) { return; } if ($relationFields[ModelTable::HAS_MANY]) { $relationType = ModelTable::HAS_MANY; } else { if ($relationFields[ModelTable::HAS_ONE]) { $relationType = ModelTable::HAS_ONE; } else { return; } } $relationField = array_shift($relationFields[$relationType]); if ($relationField->isLocalized()) { $linkModelName = $field->getLinkModelName(); if (empty($linkModelName)) { throw new ModelException('No link model found for field ' . $name . ' in ' . $modelName); } $relation->setLinkModelName($linkModelName); } }