2012-01-05 5 views
29

¿Qué se usa en lugar de ENUM en Doctrine2? smallint? Pensé en usar varchar, o explícitamente definir char, pero esto puede no ser muy efectivo cuando se trata de índices, ¿o estoy equivocado?¿Qué usas en lugar de ENUM en doctrine2?

+0

creo que es necesario este libro de cocina (tomado de la documentación oficial Doctrina): http://www.doctrine-project.org/docs /orm/2.1/en/cookbook/mysql-enums.html Es exactamente su problema y ofrece 2 soluciones. Simplemente elige el tuyo. – Nanocom

Respuesta

57

Suelo trabajar con números enteros asignados a constantes de clase, como

class MyEntity { 
    const STATUS_INACTIVE = 0; 
    const STATUS_ACTIVE = 1; 
    const STATUS_REFUSE = 2; 

    protected $status = self::STATUS_ACTIVE; 
} 

que funciona bastante bien y hace que sea aún más fácil de trabajar con lo que llamarían ENUMS en un IDE.

También puede use an enumerable type as described by the documentation, pero eso significa que tendrá que definir un tipo personalizado por columna enum. Eso es mucho trabajo sin ningún beneficio real.

Puede que también desee saber why you shouldn't really use enums.

+0

un problema: al tratar con valores fuera de 'MyEntity', tienes que volver a codificar las constantes o usar' 0, 1, 2'. es decir '$ entity-> setStatus (STATUS_ACTIVE); // no funciona fuera de MyEntity' – Dennis

+12

@Dennis el uso sería '$ entity-> setStatus (MyEntity :: STATUS_ACTIVE);' – Ocramius

+0

¿Esto no combina las clases que usan 'MyEntity' con la implementación específica? ¿Sería mejor definir estas constantes en un 'MyEntityInterface' que luego implementaría' MyEntity'? – Alex

3

Postgres, Symfony, ORM, la doctrina ...

  1. Postgress Definir nueva enumeración tipo (pgAdmin)

CREATE TYPE new_enum AS ENUM ('triste', 'ok ', 'contento');

  1. En Entidad

@ORM \ Columna (name = "nombre", type = "string", ColumnDefinition = "new_enum", anulable = true)

  1. En config.yml

mapping_types:
        new_enum: cadena

# Doctrine Configuration 
doctrine: 
    dbal: 
     driver: "%database_driver%" 
     host:  "%database_host%" 
     port:  "%database_port%" 
     dbname: "%database_name%" 
     user:  "%database_user%" 
     password: "%database_password%" 
     charset: UTF8 
     mapping_types: 
      new_enum: string # <======= 
Cuestiones relacionadas