2012-09-28 19 views
67

Ich möchte zusammengesetzte eindeutige Schlüssel in der Lehre tun. Das sind meine Felder:Doktrin und zusammengesetzte eindeutige Schlüssel

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

Wie kann ich Lehre zeigen, dass diejenigen, die miteinander kombiniert Verbund eindeutigen Schlüssel sind?

Antwort

146

Antwort auf die Frage:

use Doctrine\ORM\Mapping\UniqueConstraint; 

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

Siehe @UniqueConstraint

+3

Vielen Dank für die Informationen hinzufügen ~ Als eine Anmerkung, wenn Sie Ihre eigene Frage gelöst haben, während Sie nicht sofort akzeptieren können, ist es allgemein gute Form, Ihre eigene Antwort zu akzeptieren, gerade wenn Leute suchen, zeigt es, da es eine annehmbare Antwort gibt. – Rixius

+2

Ist es möglich mit '-ToOne' Assoziationen (Fremdschlüssel) zu arbeiten? –

+2

Ich weiß, das ist ein alter Post, aber @Dimitry K ist es möglich. Sie müssen nur den Spaltennamen wie in Ihrer @ORM \ JoinColumn verwenden (name = "join_table_id", referenzierteColumnName = "id", nullable = false). Hier ist 'join_table_id'. – herr

14

Ich finde es ausführlicher zu use nur ORM und dann Präfix ORM in Anmerkungen. Beachten Sie auch, dass Sie die Anmerkung auf mehrere Zeilen aufteilen können, um sie lesbarer zu machen, insbesondere wenn Sie mehrere Elemente erwähnen müssen (Index im folgenden Beispiel).

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

Ich weiß, dass dies eine alte Frage, aber ich kam über sie, während nach einer Möglichkeit, Verbund PK zu schaffen und dachte es einige Updates nutzen könnte.

Die Dinge sind eigentlich viel einfacher, wenn Sie einen zusammengesetzten Primärschlüssel benötigen. (Was natürlich garantiert Einzigartigkeit) Lehre Dokumentation einige schöne Beispiele von dieser URL enthält: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

So das ursprüngliche Beispiel wie folgt aussehen könnte:

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

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

Einige Hinweise hier:

  1. Spalte „Name“, da Lehre weggelassen ist in der Lage auf den Eigenschaftsnamen
  2. seit videoDimension undBasis zu erratensind beiden Teile der PK - es gibt keine Notwendigkeit nullable = false
  3. Bei Bedarf angeben - der Composite-PK von Fremdschlüssel zusammengesetzt sein kann, so fühlen sich frei, einige relational Mappings
+0

Was Sie getan haben, ist ein zusammengesetzter Primärschlüssel. Sicher wird es einzigartig sein, aber es ist ein Primärschlüssel ...;) – Preciel

+0

Nun ja, ich denke, ich habe das in meiner Antwort erwähnt :) Eigentlich wäre der Begriff "Unique Index" in OPs Fall besser geeignet, wenn er es nicht getan hätte. t bedeutet PK zu erstellen (das ist, was die angenommene Antwort tut). Aber da die Frage den seltsamen Begriff "zusammengesetzter eindeutiger Schlüssel" enthält - ich sehe nicht, warum wir nicht davon ausgehen können, dass es sich um einen zusammengesetzten Primärschlüssel handelt - habe ich zumindest nach dieser Frage gesucht. Prost! –

Verwandte Themen