2012-09-28 13 views
67

Quiero hacer clave única compuesta en doctrina. Esos son mis campos:Doctrina y claves únicas compuestas

/** 
    * @var string $videoDimension 
    * 
    * @Column(name="video_dimension", type="string", nullable=false) 
    */ 
    private $videoDimension; 

    /** 
    * @var string $videoBitrate 
    * 
    * @Column(name="video_bitrate", type="string", nullable=false) 
    */ 
    private $videoBitrate; 

¿Cómo puedo mostrar la doctrina, que los combinados juntos son clave única compuesta?

Respuesta

146

respuesta a la pregunta:

use Doctrine\ORM\Mapping\UniqueConstraint; 

/** 
* Common\Model\Entity\VideoSettings 
* 
* @Table(name="video_settings", 
* uniqueConstraints={ 
*  @UniqueConstraint(name="video_unique", 
*   columns={"video_dimension", "video_bitrate"}) 
* } 
*) 
* @Entity 
*/ 

Ver @UniqueConstraint

+3

Gracias por la información ~ Como nota, si resolvió su propia pregunta, aunque no puede aceptar de inmediato, generalmente es una buena forma de aceptar su propia respuesta, solo si la gente está buscando, se muestra como que hay una respuesta aceptable. – Rixius

+2

¿Es posible hacerlo con asociaciones '-ToOne' (claves externas)? –

+2

Sé que esta es una publicación anterior, pero @Dimitry K es posible. Solo necesita usar el nombre de columna como en su @ORM \ JoinColumn (name = "join_table_id", referenciado ColumnName = "id", nullable = false). Aquí está 'join_table_id'. – herr

14

me resulta más prolija a use única ORM y luego prefijo ORM en las anotaciones. También tenga en cuenta que puede dividir la anotación en varias líneas para que sea más legible, especialmente si tiene varios elementos para mencionar (indexe en el ejemplo a continuación).

use Doctrine\ORM\Mapping as ORM; 

/** 
* VideoSettings 
* 
* @ORM\Cache(usage="NONSTRICT_READ_WRITE") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\VideoSettingsRepository") 
* @ORM\Table(name="emails", uniqueConstraints={ 
*  @ORM\UniqueConstraint(name="dimension_bitrate", columns={"video_dimension", "video_bitrate"}) 
* }, indexes={ 
*  @ORM\Index(name="name", columns={"nane"}) 
* }) 
*/ 
class VideoSettings 
1

Sé que esto es una vieja pregunta, pero me encontré con que en la búsqueda de una manera de crear PK compuesto y pensó que podría utilizar un poco de actualización.

Las cosas son en realidad mucho más simples si lo que necesita es una clave primaria compuesta. (Lo cual, por supuesto, garantiza la unicidad) Documentación Doctrina contiene algunos buenos ejemplos de esta url: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Así que el ejemplo original podría ser algo como esto:

/** 
* @var string $videoDimension 
* 
* @ORM\Id @ORM\Column(type="string") 
*/ 
private $videoDimension; 

/** 
* @var string $videoBitrate 
* 
* @ORM\Id @ORM\Column(type="string") 
*/ 
private $videoBitrate; 

algunas notas aquí:

  1. columna "nombre" se omite ya Doctrina es capaz de adivinar que basa en el nombre de propiedad
  2. desde videoDimension y.210 son dos partes de la PK - no hay necesidad de especificar nullable = false
  3. Si es necesario - el PK compuesto puede estar compuesta de claves externas, por lo que no dude en añadir algunas asignaciones relacionales
+0

Lo que hizo es una clave primaria compuesta. Claro que será único, pero es la clave principal ...;) – Preciel

+0

Bueno, sí, creo que lo mencioné en mi respuesta :) En realidad, el término "índice único" sería más apropiado en el caso de OP si no lo hiciera t significa crear PK (eso es lo que hace la respuesta aceptada). Pero dado que la pregunta contiene un término extraño "clave única compuesta", no veo por qué no podemos suponer que es una clave primaria compuesta, al menos eso es lo que he estado buscando cuando me encontré con esta pregunta. ¡Aclamaciones! –

Cuestiones relacionadas