Doktrin und zusammengesetzte eindeutige Schlüssel

95

Ich möchte einen zusammengesetzten einzigartigen Schlüssel in der Lehre machen. Das sind meine Felder:

/**
 * @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 die Lehre zeigen, dass diese zusammen einen zusammengesetzten eindeutigen Schlüssel darstellen?

Nikoole
quelle

Antworten:

215

Beantworte 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

Nikoole
quelle
3
Vielen Dank für die Informationen ~ Wenn Sie Ihre eigene Frage gelöst haben, obwohl Sie sie nicht sofort akzeptieren können, ist es im Allgemeinen eine gute Form, Ihre eigene Antwort zu akzeptieren. Wenn also Leute suchen, wird angezeigt, dass es eine akzeptable Antwort gibt.
Rixius
2
Ist es möglich, dies mit -ToOneAssoziationen (Fremdschlüsseln) zu tun ?
Dimitry K
5
Ich weiß, dass dies ein alter Beitrag ist, aber @Dimitry K ist möglich. Sie müssen lediglich den Spaltennamen wie in Ihrer @ORM \ JoinColumn verwenden (name = "join_table_id", referencedColumnName = "id", nullable = false). Hier ist 'join_table_id'.
Herr
Beachten Sie, dass Sie Spaltennamen und keine Feldnamen angeben müssen. Sie müssen also camelCase in snake_case konvertieren und _idAssoziationen anhängen , da Doctrine auf diese Weise Spaltennamen generiert.
Gronostaj
Namen werden @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})
automatisch generiert
18

Ich finde es ausführlicher, usenur ORM zu verwenden und dann ORMAnmerkungen voranzustellen. Beachten Sie auch, dass Sie Anmerkungen in mehrere Zeilen unterteilen können, um die Lesbarkeit zu verbessern, 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={"name"})
 * })
 */
class VideoSettings
Luchaninov
quelle
2

Ich weiß, dass dies eine alte Frage ist, aber ich bin auf sie gestoßen, als ich nach einer Möglichkeit gesucht habe, eine zusammengesetzte PK zu erstellen, und dachte, sie könnte ein Update gebrauchen.

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

Das ursprüngliche Beispiel könnte also ungefähr so ​​aussehen:

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

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

Ein paar Anmerkungen hier:

  1. Die Spalte "Name" wird weggelassen, da Doctrine sie anhand des Eigenschaftsnamens erraten kann
  2. Seit videoDimensionundvideoBitrate beide Teile der PK sind, ist keine Angabe erforderlichnullable = false
  3. Bei Bedarf besteht die zusammengesetzte PK möglicherweise aus Fremdschlüsseln. Fügen Sie daher einige relationale Zuordnungen hinzu
Stas Parshyn
quelle
Was Sie getan haben, ist ein zusammengesetzter Primärschlüssel. Sicher wird es einzigartig sein, aber es ist ein Primärschlüssel ...;)
Preciel
Nun ja, ich denke, ich habe das in meiner Antwort erwähnt :) Eigentlich wäre der Begriff "eindeutiger Index" in OPs Fall angemessener, wenn er nicht PK erstellen wollte (das ist, was die akzeptierte Antwort tut). Aber da die Frage einen seltsamen Begriff "zusammengesetzter eindeutiger Schlüssel" enthält - ich verstehe nicht, warum wir nicht davon ausgehen können, dass es sich um einen zusammengesetzten Primärschlüssel handelt - habe ich zumindest danach gesucht, als ich auf diese Frage gestoßen bin. Prost!
Stas Parshyn