/** * 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')); }
/** * @depends testResolveWithHasManyAndLinkTypeSpecific */ public function testResolveWithHasManyAndLinkTypePolymorphic() { $modelClassName = 'Campaign'; $relationName = 'files'; $relationMetadata = array(RedBeanModel::HAS_MANY, 'FileModel', RedBeanModel::OWNED, RedBeanModel::LINK_TYPE_POLYMORPHIC, 'relatedModel'); $column = RedBeanModelRelationToColumnAdapter::resolve($modelClassName, $relationName, $relationMetadata, static::$messageLogger); $this->assertNull($column); $polymorphicColumns = RedBeanModelRelationToColumnAdapter::resolvePolymorphicColumnsByTableName('filemodel'); $this->assertNotEmpty($polymorphicColumns); $this->assertCount(2, $polymorphicColumns); $this->assertArrayHasKey('name', $polymorphicColumns[0]); $this->assertArrayHasKey('type', $polymorphicColumns[0]); $this->assertArrayHasKey('unsigned', $polymorphicColumns[0]); $this->assertArrayHasKey('notNull', $polymorphicColumns[0]); $this->assertArrayHasKey('collation', $polymorphicColumns[0]); $this->assertArrayHasKey('default', $polymorphicColumns[0]); $this->assertEquals('relatedmodel_id', $polymorphicColumns[0]['name']); $this->assertEquals('INT(11)', $polymorphicColumns[0]['type']); $this->assertEquals('UNSIGNED', $polymorphicColumns[0]['unsigned']); $this->assertEquals('NULL', $polymorphicColumns[0]['notNull']); // Not Coding Standard $this->assertNull($polymorphicColumns[0]['collation']); $this->assertEquals('DEFAULT NULL', $polymorphicColumns[0]['default']); // Not Coding Standard $this->assertArrayHasKey('name', $polymorphicColumns[1]); $this->assertArrayHasKey('type', $polymorphicColumns[1]); $this->assertArrayHasKey('unsigned', $polymorphicColumns[1]); $this->assertArrayHasKey('notNull', $polymorphicColumns[1]); $this->assertArrayHasKey('collation', $polymorphicColumns[1]); $this->assertArrayHasKey('default', $polymorphicColumns[1]); $this->assertEquals('relatedmodel_type', $polymorphicColumns[1]['name']); $this->assertEquals('VARCHAR(255)', $polymorphicColumns[1]['type']); $this->assertNull($polymorphicColumns[1]['unsigned']); $this->assertEquals('NULL', $polymorphicColumns[1]['notNull']); // Not Coding Standard $this->assertEquals('COLLATE utf8_unicode_ci', $polymorphicColumns[1]['collation']); $this->assertEquals('DEFAULT NULL', $polymorphicColumns[1]['default']); // Not Coding Standard }