/** * Generates a column definition or processes junctions table depending on relation and link type. * @param string $modelClassName * @param string $relationName * @param array $relationMetadata * @param $messageLogger * @return array|null */ public static function resolve($modelClassName, $relationName, array $relationMetadata, &$messageLogger) { $column = null; if (!empty($modelClassName) && @class_exists($modelClassName) && !empty($relationName) && count($relationMetadata) >= 2 && @class_exists($relationMetadata[1])) { $relationType = $relationMetadata[0]; $relatedModelClass = $relationMetadata[1]; $linkType = RedBeanModel::LINK_TYPE_ASSUMPTIVE; if (isset($relationMetadata[3])) { $linkType = $relationMetadata[3]; } if (!in_array($relationType, array(RedBeanModel::HAS_ONE_BELONGS_TO, RedBeanModel::HAS_MANY_BELONGS_TO, RedBeanModel::HAS_ONE, RedBeanModel::HAS_MANY, RedBeanModel::MANY_MANY))) { return false; } if ($relationType == RedBeanModel::MANY_MANY) { RedBeanModelToJoinTableAdapter::resolve($modelClassName, $relationMetadata, $messageLogger); return null; } elseif (in_array($relationType, array(RedBeanModel::HAS_ONE, RedBeanModel::HAS_MANY_BELONGS_TO))) { $linkName = null; if ($linkType == RedBeanModel::LINK_TYPE_ASSUMPTIVE && strtolower($relatedModelClass) != strtolower($relationName)) { $linkName = strtolower($relationName) . '_'; } $name = $linkName . RedBeanModel::getForeignKeyName($modelClassName, $relationName); $column = RedBeanModelMemberToColumnUtil::resolveForeignKeyColumnMetadata($name); } elseif ($relationType == RedBeanModel::HAS_MANY && $linkType == RedBeanModel::LINK_TYPE_POLYMORPHIC) { static::setColumnsForPolymorphicLink($relatedModelClass, $relationMetadata[4]); } // ignore HAS_MANY(non-polymorphic) and HAS_ONE_BELONGS_TO as we are dealing with HAS_ONE and HAS_MANY_BELONGS e.g. // we are ignore the sides which shouldn't have columns. } else { return false; } return $column; }
/** * @depends testResolveWithNonManyManyRelationship */ public function testResolve() { $modelClassName = 'Person'; $relationMetadata = array(RedBeanModel::MANY_MANY, 'User'); RedBeanModelToJoinTableAdapter::resolve($modelClassName, $relationMetadata, static::$messageLogger); $processedTables = RedBeanModelToJoinTableAdapter::resolveProcessedTableNames(); $this->assertNotEmpty($processedTables); $this->assertCount(1, $processedTables); $this->assertEquals('_user_person', $processedTables[0]); }
/** * @depends testResolveWithManyManyAndLinkTypeAssumptive */ public function testResolveWithManyManyAndLinkTypeSpecific() { $modelClassName = 'Conversation'; $relationName = 'conversationItems'; $relationMetadata = array(RedBeanModel::MANY_MANY, 'Item', RedBeanModel::OWNED, RedBeanModel::LINK_TYPE_SPECIFIC, 'cItems'); $column = RedBeanModelRelationToColumnAdapter::resolve($modelClassName, $relationName, $relationMetadata, static::$messageLogger); $this->assertNull($column); $processedTables = RedBeanModelToJoinTableAdapter::resolveProcessedTableNames(); $this->assertNotEmpty($processedTables); $this->assertCount(3, $processedTables); $this->assertEquals('contact_opportunity', $processedTables[0]); $this->assertEquals('conversation_item', $processedTables[1]); $this->assertEquals('citems_conversation_item', $processedTables[2]); }