public function testRegisterModelWithLinkedHasManyModelsToSelfRegistersLinkModel() { $hasMany1 = new HasManyField('field', 'tableWithLinkToSelf'); $model1 = $this->createModel('tableWithLinkToSelf', array($hasMany1)); $this->register->registerModel($model1); $linkModelName = 'tableWithLinkToSelftableWithLinkToSelf'; $linkModel = $this->register->getModel($linkModelName); $linkModelTable = $linkModel->getMeta()->getModelTable(); $fields = $linkModelTable->getFields(); $this->assertEquals($linkModelName, $hasMany1->getLinkModelName()); $found = array(); foreach ($fields as $field) { if ($field->getName() == 'tableWithLinkToSelf1') { $this->assertEquals('tableWithLinkToSelf', $field->getRelationModelName()); } if ($field->getName() == 'tableWithLinkToSelf2') { $this->assertEquals('tableWithLinkToSelf', $field->getRelationModelName()); } $found[] = $field->getName(); } $this->assertEquals(array('id', 'tableWithLinkToSelf1', 'tableWithLinkToSelf2'), $found); }
/** * Gets the link model name for a many to many relation * @param zibo\library\orm\definition\field\HasManyField $field1 * @param zibo\library\orm\definition\field\HasManyField $field2 * @param zibo\library\orm\model\meta\ModelMeta $modelMeta Meta of the model of the field * @param string $fieldName Field for the link model * @return string Name of the link model * @throws zibo\library\orm\exception\ModelException when field1 and field2 have the link model set but they are not the same */ private function getManyToManyLinkModelName(HasManyField $field1, HasManyField $field2, ModelMeta $modelMeta, $fieldName) { $linkModelName1 = $field1->getLinkModelName(); $linkModelName2 = $field2->getLinkModelName(); if ($linkModelName1 && $linkModelName2) { if ($linkModelName1 != $linkModelName2) { throw new ModelException('Link model names of ' . $field1->getName() . ' and ' . $field2->getName() . ' are not equal'); } return $linkModelName1; } if ($linkModelName1) { return $linkModelName1; } if ($linkModelName2) { return $linkModelName2; } $modelName1 = $field1->getRelationModelName(); $modelName2 = $field2->getRelationModelName(); $linkModelName = $this->generateLinkModelName($modelName1, $modelName2); return $this->getUniqueLinkModelName($modelMeta, $fieldName, $linkModelName); }