web-dev-qa-db-fra.com

Doctrine et clés uniques composites

Je veux faire la clé unique composite dans la 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 la doctrine, que ceux qui sont combinés sont une clé unique composite?

87
Nikoole

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

191
Nikoole

Je trouve plus verbeux que use seulement ORM, puis le préfixe ORM dans les annotations. Notez également que vous pouvez diviser une annotation en plusieurs lignes pour la rendre plus lisible, en particulier 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={"nane"})
 * })
 */
class VideoSettings
16
luchaninov

Je sais que cette question est ancienne, mais je l’ai trouvée en cherchant un moyen de créer une PK composite et je pensais pouvoir utiliser une mise à jour.

Les choses sont en réalité beaucoup plus simples si vous avez besoin d’une clé primaire composite. (Ce qui, bien sûr, garantit l'unicité) Doctrine contient quelques exemples intéressants de 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 puisque Doctrine est capable de le deviner en fonction du nom de la propriété
  2. Puisque videoDimension et videoBitrate font tous les deux partie de la PK, il n’est pas nécessaire de spécifier nullable = false
  3. Si nécessaire - la PC composite peut être composée de clés étrangères, alors n'hésitez pas à ajouter des correspondances relationnelles
1
Stas Parshyn