/** * @param \Doctrine\ORM\Tools\Event\SchemaColumnDefinitionEventArgs $args */ public function onSchemaColumnDefinition(SchemaColumnDefinitionEventArgs $args) { $tableColumn = $args->getTableColumn(); $table = $args->getTable(); $conn = $args->getConnection(); $tableColumn = array_change_key_case($tableColumn, CASE_LOWER); switch (strtolower($tableColumn['type'])) { case 'point': case 'linestring': case 'polygon': case 'multipoint': case 'multilinestring': case 'multipolygon': case 'geometrycollection': break; default: return; } $sql = "SHOW INDEX FROM " . $table . " WHERE Column_name = ?"; $stmt = $conn->prepare($sql); $stmt->execute(array($this->generateIndexName($table, $tableColumn['field']))); $indexExists = (bool) $stmt->fetch(\PDO::FETCH_ASSOC); $options = array('length' => null, 'unsigned' => false, 'fixed' => null, 'default' => isset($tableColumn['default']) ? $tableColumn['default'] : null, 'notnull' => (bool) ($tableColumn['null'] != 'YES'), 'scale' => null, 'precision' => null, 'autoincrement' => false, 'comment' => isset($tableColumn['comment']) ? $tableColumn['comment'] : null); $column = new Column($tableColumn['field'], Type::getType($tableColumn['type']), $options); $column->setCustomSchemaOption('spatial_srid', 4326)->setCustomSchemaOption('spatial_dimension', 2)->setCustomSchemaOption('spatial_index', $indexExists); $args->preventDefault()->setColumn($column); }
/** * Listener for column definition events. This intercepts definitions * for custom doctrine types and builds the appropriate Column Object. * * @param \Doctrine\DBAL\Event\SchemaColumnDefinitionEventArgs $event * @throws \Doctrine\DBAL\DBALException */ public function onSchemaColumnDefinition(SchemaColumnDefinitionEventArgs $event) { $tableColumn = $event->getTableColumn(); $tableColumn = array_change_key_case($tableColumn, CASE_LOWER); $dbType = $this->getDatabaseType($tableColumn['type']); if ($dbType !== 'enum' && $dbType !== 'set') { return; } $column = $this->getEnumerationTableColumnDefinition($tableColumn, $event->getDatabasePlatform()); $event->setColumn($column); $event->preventDefault(); }
/** * @param \Doctrine\ORM\Tools\Event\SchemaColumnDefinitionEventArgs $args */ public function onSchemaColumnDefinition(SchemaColumnDefinitionEventArgs $args) { $tableColumn = $args->getTableColumn(); $table = $args->getTable(); $conn = $args->getConnection(); $tableColumn = array_change_key_case($tableColumn, CASE_LOWER); if ($tableColumn['type'] !== 'geometry') { return; } $sql = "SELECT COUNT(*) as index_exists\n FROM pg_class, pg_index\n WHERE oid IN (\n SELECT indexrelid\n FROM pg_index si, pg_class sc, pg_namespace sn\n WHERE sc.relname = ? AND sc.oid = si.indrelid AND sc.relnamespace = sn.oid\n ) AND pg_index.indexrelid = oid AND relname = ?"; $stmt = $conn->prepare($sql); $stmt->execute(array($table, $this->generateIndexName($table, $tableColumn['field']))); $row = $stmt->fetch(\PDO::FETCH_ASSOC); $indexExists = $row['index_exists'] > 0; $sql = 'SELECT coord_dimension, srid, type FROM geometry_columns WHERE f_table_name = ? AND f_geometry_column = ?'; $stmt = $conn->prepare($sql); $stmt->execute(array($table, $tableColumn['field'])); $row = $stmt->fetch(\PDO::FETCH_ASSOC); $type = strtolower($row['type']); $options = array('length' => null, 'notnull' => (bool) $tableColumn['isnotnull'], 'default' => isset($tableColumn['default']) ? $tableColumn['default'] : null, 'primary' => (bool) ($tableColumn['pri'] == 't'), 'precision' => null, 'scale' => null, 'fixed' => null, 'unsigned' => false, 'autoincrement' => false, 'comment' => isset($tableColumn['comment']) ? $tableColumn['comment'] : null); $column = new Column($tableColumn['field'], Type::getType($type), $options); $column->setCustomSchemaOption('spatial_srid', (int) $row['srid'])->setCustomSchemaOption('spatial_dimension', (int) $row['coord_dimension'])->setCustomSchemaOption('spatial_index', (bool) $indexExists); $args->preventDefault()->setColumn($column); }
public function onSchemaColumnDefinition(SchemaColumnDefinitionEventArgs $args) { $tableColumn = array_change_key_case($args->getTableColumn(), CASE_LOWER); $table = $args->getTable(); $info = null; if ('geometry' === $tableColumn['type']) { $info = $this->schemaManager->getGeometrySpatialColumnInfo($table, $tableColumn['field']); } elseif ('geography' === $tableColumn['type']) { $info = $this->schemaManager->getGeographySpatialColumnInfo($table, $tableColumn['field']); } if (!$info) { return; } $default = null; if (isset($tableColumn['default']) && 'NULL::geometry' !== $tableColumn['default'] && 'NULL::geography' !== $tableColumn['default']) { $default = $tableColumn['default']; } $options = array('notnull' => (bool) $tableColumn['isnotnull'], 'default' => $default, 'primary' => (bool) ($tableColumn['pri'] == 't'), 'comment' => isset($tableColumn['comment']) ? $tableColumn['comment'] : null); $column = new Column($tableColumn['field'], PostGISType::getType($tableColumn['type']), $options); $column->setCustomSchemaOption('geometry_type', $info['type'])->setCustomSchemaOption('srid', $info['srid']); $args->setColumn($column)->preventDefault(); }