138 votes

Doctrine et clés uniques composites

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

/**
 * @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 à doctrine que ces deux champs combinés forment une clé unique composite ?

271voto

Nikoole Points 542

Répondez à 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

3 votes

Merci pour l'information~ En note, si vous avez résolu votre propre question, bien que vous ne puissiez pas l'accepter immédiatement, il est généralement de bon ton d'accepter votre propre réponse, simplement pour que si d'autres personnes recherchent, elle apparaisse comme une réponse acceptable.

2 votes

Est-il possible de le faire avec des associations -ToOne (clés étrangères) ?

5 votes

Je sais que cet article est ancien, 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). Ici, c'est 'join_table_id'.

40voto

BBeta Points 544

Si quelqu'un souhaite utiliser les attributs PHP 8 au lieu des annotations Doctrine :

use Doctrine\ORM\Mapping as ORM;

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

26voto

how Points 950

Je trouve qu'il est plus verbeux d'utiliser uniquement ORM puis de préfixer ORM dans les annotations. Notez également que vous pouvez diviser les annotations sur plusieurs lignes pour les rendre plus lisibles, surtout si vous avez plusieurs éléments à mentionner (l'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

3voto

Stas Parshin Points 708

Je sais que c'est une vieille question, mais je suis tombé dessus en cherchant un moyen de créer une clé primaire composite et j'ai pensé qu'elle pourrait être mise à jour.

Les choses sont en réalité beaucoup plus simples si ce dont vous avez besoin est une Clé Primaire Composite. (Ce qui, bien sûr, garantit l'unicité) La documentation de Doctrine contient quelques exemples intéressants à cette adresse : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Ainsi, l'exemple original 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 "name" est omise car Doctrine est capable de la deviner en fonction du nom de la propriété
  2. Étant donné que videoDimension et videoBitrate sont tous deux des parties de la PK - il n'est pas nécessaire de spécifier nullable = false
  3. Si nécessaire - la PK Composite peut être composée de clés étrangères, alors n'hésitez pas à ajouter des relations

3voto

Ponylord Points 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X