/**
  * @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);
 }
Esempio n. 2
0
 /**
  * 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();
 }