Doctrine et clés uniques composites

96

Je veux faire une clé unique composite dans la doctrine. Ce sont mes domaines:

/**
 * @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;

Comment puis-je montrer la doctrine, que ceux combinés ensemble sont une clé unique composite?

Nikoole
la source

Réponses:

216

Répondre à la question:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Voir @UniqueConstraint

Nikoole
la source
3
Merci pour l'information ~ En guise de note, si vous avez résolu votre propre question, alors que vous ne pouvez pas accepter immédiatement, c'est généralement une bonne forme d'accepter votre propre réponse, tout simplement si les gens recherchent, cela montre qu'il y a une réponse acceptable.
Rixius
2
Est-il possible de le faire avec des -ToOneassociations (clés étrangères)?
Dimitry K
5
Je sais que c'est un ancien post, mais @Dimitry K c'est possible. Il vous suffit d'utiliser le nom de la colonne comme dans votre @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Voici «join_table_id».
herr
Notez que vous devez fournir des noms de colonnes , pas des noms de champs. Vous devez donc convertir camelCase en snake_case et ajouter _idpour les associations, car c'est ainsi que Doctrine génère les noms de colonnes.
gronostaj
les noms sont générés automatiquement @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})et rien d'autre n'a d'importance
Vasilii Suricov
18

Je le trouve plus verbeux que pour useORM puis préfixe ORMdans les annotations. Notez également que vous pouvez diviser l'annotation en plusieurs lignes pour la rendre plus lisible surtout si vous avez plusieurs éléments à mentionner (index dans l'exemple ci-dessous).

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
la source
2

Je sais que c'est une vieille question, mais je l'ai rencontrée en cherchant un moyen de créer un PK composite et j'ai pensé qu'il pourrait utiliser une mise à jour.

Les choses sont en fait beaucoup plus simples si vous avez besoin d'une clé primaire composite. (Ce qui, bien sûr, garantit l'unicité) La documentation de Doctrine contient quelques bons exemples par cette url: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Ainsi, l'exemple d'origine pourrait ressembler à ceci:

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

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

Quelques notes ici:

  1. La colonne «nom» est omise car Doctrine est capable de la deviner en fonction du nom de la propriété
  2. Puisque videoDimensionet videoBitratefont tous deux partie de la PK - il n'est pas nécessaire de spécifiernullable = false
  3. Si nécessaire, le PK composite peut être composé de clés étrangères, alors n'hésitez pas à ajouter des mappages relationnels
Stas Parshyn
la source
Ce que vous avez fait est une clé primaire composite. Bien sûr, ce sera unique, mais c'est une clé primaire ...;)
Preciel
Eh bien oui, je pense l'avoir mentionné dans ma réponse :) En fait, le terme "index unique" serait plus approprié dans le cas d'OP s'il ne voulait pas créer PK (c'est ce que fait la réponse acceptée). Mais puisque la question contient un terme étrange "clé unique composite" - je ne vois pas pourquoi nous ne pouvons pas supposer qu'il s'agit d'une clé primaire composite - du moins c'est ce que je cherchais quand je suis tombé sur cette question. À votre santé!
Stas Parshyn