2012-09-28 11 views
67

Voglio fare una chiave univoca composita in dottrina. Questi sono i miei campi:Tasti univoci di Doctrine e Composite

/** 
    * @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 coloro che combinati insieme sono chiave unica composito?

risposta

146

rispondere 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 
*/ 

Vedi @UniqueConstraint

+3

Grazie per l'informazione ~ Come nota, se hai risolto la tua domanda, mentre non puoi accettare immediatamente, è generalmente buona norma accettare la tua risposta, solo così se la gente cerca, mostra che c'è una risposta accettabile. – Rixius

+2

È possibile farlo con le associazioni '-ToOne' (chiavi esterne)? –

+2

So che questo è vecchio post, ma @Dimitry K è possibile. Solo tu devi usare il nome della colonna come nella tua @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Ecco 'join_table_id'. – herr

14

trovo più prolisso per use solo ORM e quindi il prefisso ORM nelle annotazioni. Si noti inoltre che è possibile interrompere l'annotazione su più righe per renderla più leggibile, specialmente se si dispone di 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={"nane"}) 
* }) 
*/ 
class VideoSettings 
1

So che questa è una vecchia questione, ma mi sono imbattuto, mentre alla ricerca di un modo per creare composito PK e ho pensato che potrebbe usare qualche aggiornamento.

Le cose sono in realtà molto più semplici se quello che ti serve è una chiave primaria composta. (Il che, naturalmente, garantisce l'unicità) Documentazione Dottrina contiene alcuni esempi belle da questo URL: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Così l'esempio originale potrebbe essere simile a questa:

/** 
* @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. colonna "nome" è omesso in quanto dottrina è in grado di indovinare si basa sulla il nome della proprietà
  2. dal videoDimension e.210 sono entrambe le parti del PK - non c'è bisogno di specificare nullable = false
  3. Se necessario - il Composite PK può essere composto da chiavi esterne, quindi sentitevi liberi di aggiungere alcune mappature relazionali
+0

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

+0

Beh sì, penso di averlo menzionato nella mia risposta :) In realtà il termine "indice univoco" sarebbe più appropriato nel caso dell'OP se non lo avesse fatto t significa creare PK (è quello che fa la risposta accettata). Ma dal momento che la domanda contiene un termine strano "chiave univoca composita" - non vedo perché non possiamo ritenere che sia una chiave primaria composta - almeno questo è quello che stavo cercando quando ho trovato questa domanda. Saluti! –