Doctrina y claves únicas compuestas

96

Quiero hacer una clave única compuesta en la doctrina. Esos son mis campos:

/**
 * @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 de que los que se combinan son una clave única compuesta?

Nikoole
fuente

Respuestas:

216

Responde 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

Nikoole
fuente
3
Gracias por la información ~ Como nota, si resolvió su propia pregunta, aunque no puede aceptar de inmediato, generalmente es una buena forma aceptar su propia respuesta, solo así que si la gente está buscando, se muestra que hay una respuesta aceptable.
Rixius
2
¿Es posible hacerlo con -ToOneasociaciones (claves externas)?
Dimitry K
5
Sé que esta es una publicación antigua, pero @Dimitry K es posible. Solo necesita usar el nombre de la columna como en su @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Aquí está 'join_table_id'.
herr
Tenga en cuenta que debe proporcionar nombres de columna , no nombres de campo. Así que tienes que convertir camelCase en snake_case y agregar _idasociaciones, porque así es como Doctrine genera nombres de columna.
gronostaj
los nombres se generan automáticamente @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})y nada más importa
Vasilii Suricov
18

Lo encuentro más detallado usesolo con ORM y luego prefijo ORMen 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 (índice en el ejemplo siguiente).

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={"name"})
 * })
 */
class VideoSettings
luchaninov
fuente
2

Sé que esta es una pregunta antigua, pero la encontré mientras buscaba una forma de crear PK compuesta y pensé que podría usar alguna actualización.

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

Entonces, el ejemplo original podría verse así:

/**
 * @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. La columna "nombre" se omite ya que Doctrine puede adivinarla basándose en el nombre de la propiedad.
  2. Dado que videoDimensiony videoBitrateson ambas partes del PK, no es necesario especificarnullable = false
  3. Si es necesario, la PK compuesta puede estar compuesta de claves externas, así que siéntase libre de agregar algunas asignaciones relacionales
Stas Parshyn
fuente
Lo que hizo es una clave primaria compuesta. Seguro que será único, pero es una clave principal ...;)
Preciel
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 tuviera la intención de 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 asumir que sea una clave primaria compuesta, al menos eso es lo que estaba buscando cuando me encontré con esta pregunta. ¡Salud!
Stas Parshyn