/** * Provided an array of modelClassNames database schema generation is performed using each model's metadata. * @param array $modelClassNames * @param $messageLogger */ public static function generateTablesFromModelClassNames(array $modelClassNames, &$messageLogger) { $tables = array(); if (empty($modelClassNames)) { return; } $messageLogger->addInfoMessage(Zurmo::t('Core', 'Building Table Schema for {{count}} Models', array('{{count}}' => count($modelClassNames)))); foreach ($modelClassNames as $modelClassName) { $table = RedBeanModelToTableSchemaAdapter::resolve($modelClassName, $messageLogger); if ($table) { $tables[] = $table; } } foreach ($tables as $schemaDefinition) { $tableName = key($schemaDefinition); $polymorphicColumns = RedBeanModelRelationToColumnAdapter::resolvePolymorphicColumnsByTableName($tableName); if (!empty($polymorphicColumns)) { $columns = CMap::mergeArray($schemaDefinition[$tableName]['columns'], $polymorphicColumns); $schemaDefinition[$tableName]['columns'] = $columns; } CreateOrUpdateExistingTableFromSchemaDefinitionArrayUtil::generateOrUpdateTableBySchemaDefinition($schemaDefinition, $messageLogger); $messageLogger->addInfoMessage(Zurmo::t('Core', 'Scheme generated for {{table}}.', array('{{table}}' => $tableName))); } $messageLogger->addInfoMessage(Zurmo::t('Core', 'Schema generation completed')); }
/** * Generates column definitions and/or junction tables depending on relationships * @param string $modelClassName * @param array $relations * @param $messageLogger * @return array * @throws CException */ public static function resolve($modelClassName, array $relations, &$messageLogger) { $messageLogger->addInfoMessage(Zurmo::t('Core', 'Building Column definitions for relations of {{model}}', array('{{model}}' => $modelClassName))); $columns = array(); if ($modelClassName && @class_exists($modelClassName)) { foreach ($relations as $relationName => $relationMetadata) { $column = RedBeanModelRelationToColumnAdapter::resolve($modelClassName, $relationName, $relationMetadata, $messageLogger); if ($column) { $columns[] = $column; } elseif ($column === false) { $errorMessage = Zurmo::t('Core', 'Failed to resolve {{model}}.{{relation}} to column', array('{{model}}' => $modelClassName, '{{relation}}' => $relationName)); $messageLogger->addErrorMessage($errorMessage); throw new CException($errorMessage); } } } $messageLogger->addInfoMessage(Zurmo::t('Core', 'Column definitions for relations Built')); return $columns; }
/** * @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]); }