Kunci unik doktrin dan komposit

96

Saya ingin melakukan kunci unik gabungan dalam doktrin. Itu adalah bidang saya:

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

Bagaimana saya dapat menunjukkan ajaran, bahwa yang digabungkan bersama adalah kunci unik gabungan?

Nikoole
sumber

Jawaban:

217

Jawab pertanyaannya:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Lihat @UniqueConstraint

Nikoole
sumber
3
Terima kasih atas informasinya ~ Sebagai catatan, jika Anda menyelesaikan pertanyaan Anda sendiri, sementara Anda tidak dapat langsung menerimanya, biasanya ini adalah bentuk yang baik untuk menerima jawaban Anda sendiri, jadi jika orang-orang mencari, ini menunjukkan bahwa ada jawaban yang dapat diterima.
Rixius
2
Apakah mungkin melakukannya dengan -ToOneasosiasi (kunci asing)?
Dimitry K
5
Saya tahu ini adalah posting lama, tetapi @Dimitry K itu mungkin. Anda hanya perlu menggunakan nama kolom seperti pada @ORM \ JoinColumn Anda (name = "join_table_id", referencedColumnName = "id", nullable = false). Berikut adalah 'join_table_id'.
Herr
Perhatikan bahwa Anda harus memberikan nama kolom , bukan nama kolom . Jadi Anda harus mengubah camelCase menjadi snake_case dan menambahkan _idasosiasi, karena begitulah cara Doctrine menghasilkan nama kolom.
gronostaj
nama dibuat secara otomatis @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})dan tidak ada yang penting
Vasilii Suricov
18

Saya merasa lebih bertele-tele usehanya ke ORM dan kemudian awalan ORMdalam penjelasan. Perhatikan juga bahwa Anda dapat memecah anotasi menjadi beberapa baris agar lebih mudah dibaca terutama jika Anda memiliki beberapa item untuk disebutkan (indeks dalam contoh di bawah).

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
sumber
2

Saya tahu ini adalah pertanyaan lama, tetapi saya menemukannya saat mencari cara untuk membuat PK komposit dan berpikir itu bisa menggunakan beberapa pembaruan.

Hal-hal sebenarnya jauh lebih sederhana jika yang Anda butuhkan adalah Kunci Utama Komposit. (Yang, tentu saja, menjamin keunikan) Dokumentasi doktrin berisi beberapa contoh bagus oleh url ini: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Jadi contoh aslinya bisa terlihat seperti ini:

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

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

Beberapa catatan di sini:

  1. Kolom "nama" dihilangkan karena Doktrin dapat menebaknya berdasarkan nama properti
  2. Karena videoDimensiondan videoBitratekeduanya merupakan bagian dari PK - tidak perlu disebutkannullable = false
  3. Jika diperlukan - PK Komposit dapat terdiri dari kunci asing, jadi silakan tambahkan beberapa pemetaan relasional
Stas Parshyn
sumber
Apa yang Anda lakukan adalah kunci utama komposit. Yakin itu akan unik, tapi ini kunci utama ...;)
Preciel
Ya, saya rasa saya telah menyebutkannya dalam jawaban saya :) Sebenarnya istilah "indeks unik" akan lebih sesuai dalam kasus OP jika dia tidak bermaksud membuat PK (itulah jawaban yang diterima). Tetapi karena pertanyaan berisi istilah aneh "kunci unik komposit" - Saya tidak mengerti mengapa kita tidak dapat menganggapnya sebagai kunci utama komposit - setidaknya itulah yang saya cari ketika saya menemukan pertanyaan ini. Bersulang!
Stas Parshyn