Dottrina e chiavi univoche composte


96

Voglio creare una chiave univoca composita in dottrine. Questi sono i miei campi:

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

Come posso mostrare la dottrina, che quelli combinati insieme sono chiavi univoche composte?

Risposte:


216

Rispondi alla domanda:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Vedere @UniqueConstraint


3
Grazie per le informazioni ~ Come nota, se hai risolto la tua domanda, anche se non puoi accettare immediatamente, è generalmente una buona forma accettare la tua risposta, solo così se le persone stanno cercando, mostra che c'è una risposta accettabile.
Rixius

2
È possibile farlo con -ToOneassociazioni (chiavi esterne)?
Dimitry K

5
So che questo è un vecchio post, ma @Dimitry K è possibile. Devi solo usare il nome della colonna come nel tuo @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Ecco "join_table_id".
herr

Tieni presente che devi fornire i nomi delle colonne , non i nomi dei campi. Quindi devi convertire camelCase in snake_case e aggiungere _idper le associazioni, perché è così che Doctrine genera i nomi delle colonne.
gronostaj

i nomi sono generati automaticamente @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})e nient'altro importa
Vasilii Suricov

18

Lo trovo più dettagliato usesolo per ORM e quindi prefisso ORMnelle annotazioni. Si noti inoltre che è possibile suddividere l'annotazione su più righe per renderla più leggibile, specialmente se si hanno diversi elementi da menzionare (indice nell'esempio seguente).

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

2

So che questa è una vecchia domanda, ma mi sono imbattuto mentre cercavo un modo per creare PK composito e ho pensato che potesse usare qualche aggiornamento.

Le cose sono in realtà molto più semplici se ciò di cui hai bisogno è una chiave primaria composita. (Il che, ovviamente, garantisce l'unicità) La documentazione di Doctrine contiene alcuni bei esempi con questo URL: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Quindi l'esempio originale potrebbe assomigliare a questo:

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

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

Alcune note qui:

  1. La colonna "nome" viene omessa poiché Doctrine è in grado di indovinarla in base al nome della proprietà
  2. Poiché videoDimensione videoBitratesono entrambe parti della PK, non è necessario specificarenullable = false
  3. Se necessario, il Composite PK può essere composto da chiavi esterne, quindi sentiti libero di aggiungere alcune mappature relazionali

Quello che hai fatto è una chiave primaria composita. Certo sarà unico, ma è una chiave primaria ...;)
Preciel

Ebbene sì, penso di averlo menzionato nella mia risposta :) In realtà il termine "indice unico" sarebbe più appropriato nel caso di OP se non intendesse creare PK (questo è ciò che fa la risposta accettata). Ma poiché la domanda contiene un termine strano "chiave univoca composita" - non vedo perché non possiamo presumere che sia una chiave primaria composta - almeno questo è quello che stavo cercando quando mi sono imbattuto in questa domanda. Saluti!
Stas Parshyn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.