Doctrina y claves únicas compuestas

3 minutos de lectura

avatar de usuario
Nikoole

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, que aquellos combinados entre sí son una clave única compuesta?

avatar de usuario
Nikoole

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

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

    – Rixius

    13 de marzo de 2013 a las 22:24

  • ¿Es posible hacerlo con -ToOne asociaciones (claves foráneas)?

    – Dimitri K.

    9 oct 2014 a las 12:28

  • Sé que esta es una publicación anterior, 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’.

    – señor

    4 de marzo de 2015 a las 7:09

  • Tenga en cuenta que debe proporcionar columna nombres, no nombres de campo. Así que tienes que convertir camelCase a snake_case y agregar _id para asociaciones, porque así es como Doctrine genera nombres de columnas.

    – gronostaj

    06/03/2018 a las 13:35

  • los nombres se generan automáticamente @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})}) y nada más importa

    – Vasili Suricov

    2 mayo 2019 a las 21:54


avatar de usuario
luchaninov

Me parece más detallado use solo ORM y luego prefijo ORM en 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 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={"name"})
 * })
 */
class VideoSettings

avatar de usuario
Az.Youness

Por si alguien quiere usar Atributos PHP 8 en lugar de anotaciones de Doctrine:

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\UniqueConstraint(
  name: 'video_unique_idx',
  columns: ['video_dimension', 'video_bitrate']
)]

avatar de usuario
Stas Parshin

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

En realidad, las cosas son mucho más simples si lo que necesita es una clave primaria compuesta. (Lo que, por supuesto, garantiza la unicidad) La documentación de Doctrine contiene algunos buenos ejemplos de 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 adivinarlo en función del nombre de la propiedad.
  2. Ya que videoDimension y videoBitrate son ambas partes del PK – no hay necesidad de especificar nullable = false
  3. Si es necesario, el PK compuesto puede estar compuesto de claves externas, así que siéntase libre de agregar algunas asignaciones relacionales

Versión XML:

<unique-constraints>
    <unique-constraint columns="column1,column2" name="give_some_explicit_name" />
</unique-constraints>

Más detalles en los documentos:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/xml-mapping.html#defining-indexes-or-unique-restricciones

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad