Doktrin ve bileşik benzersiz anahtarlar


100

Doktrinde birleşik benzersiz anahtar yapmak istiyorum. Bunlar benim alanlarım:

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

Doktrini, bir araya getirilenlerin bileşik benzersiz anahtar olduğunu nasıl gösterebilirim?

Yanıtlar:


220

Soruyu cevaplayın:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Bkz @UniqueConstraint


3
Bilgi için teşekkürler ~ Not olarak, kendi sorunuzu çözdüyseniz, hemen kabul edemezken, kendi cevabınızı kabul etmek genellikle iyi bir biçimdir, yani insanlar arıyorsa, kabul edilebilir bir cevap varmış gibi görünür.
Rixius

2
-ToOneDerneklerle (yabancı anahtarlar) yapmak mümkün mü ?
Dimitry K

5
Bunun eski bir gönderi olduğunu biliyorum ama @Dimitry K mümkün. Yalnızca @ORM \ JoinColumn'unuzdaki gibi sütun adını kullanmanız gerekir (name = "join_table_id", referencedColumnName = "id", nullable = false). İşte 'join_table_id'.
herr

Alan adları değil, sütun adları sağlamanız gerektiğini unutmayın . Yani, camelCase'i snake_case'e dönüştürmeniz ve _idilişkilendirmeler için eklemeniz gerekir , çünkü Doctrine bu şekilde sütun adlarını üretir.
gronostaj

isimler otomatik oluşturulur @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})ve başka hiçbir şeyin önemi yoktur
Vasilii Suricov

19

Bunu usesadece ORM için daha ayrıntılı buluyorum ve ardından ek ORMaçıklamalarda önek buluyorum . Ayrıca, özellikle bahsedilecek birkaç öğeniz varsa daha okunaklı hale getirmek için açıklamayı birkaç satıra bölebilirsiniz (aşağıdaki örnekte dizin).

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

Bunun eski bir soru olduğunu biliyorum, ancak bileşik PK oluşturmanın bir yolunu ararken karşılaştım ve bazı güncellemeler kullanabileceğini düşündüm.

İhtiyacınız olan şey bir Bileşik Birincil Anahtar ise işler aslında çok daha basittir. (Tabii ki, benzersizliği garanti eder) Doktrin dokümantasyonu bu url ile bazı güzel örnekler içerir: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Yani orijinal örnek şunun gibi görünebilir:

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

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

Burada birkaç not:

  1. Doktrin, özellik adına göre sütunu tahmin edebildiği için "ad" sütunu çıkarılmıştır
  2. Yana videoDimensionve videoBitratePK hem parçalarıdır - belirtmek için gerek yokturnullable = false
  3. Gerekirse, Bileşik PK yabancı anahtarlardan oluşabilir, bu nedenle bazı ilişkisel eşlemeler eklemekten çekinmeyin

Yaptığınız şey bileşik bir birincil anahtardır. Elbette benzersiz olacak, ancak birincil anahtar ...;)
Preciel

Evet, sanırım cevabımda bundan bahsetmiştim :) Aslında OP'nin durumunda PK'yi yaratmak istemeseydi "benzersiz indeks" terimi daha uygun olurdu (kabul edilen cevap budur). Ancak soru tuhaf bir terim olan "bileşik benzersiz anahtar" içerdiğinden - bunu neden bileşik bir birincil anahtar olarak varsayamayacağımızı anlamıyorum - en azından bu soruyla karşılaştığımda aradığım şey buydu. Şerefe!
Stas Parshyn

0

XML sürümü:

<unique-constraints>
    <unique-constraint columns="column1,column2" name="give_some_explicit_name" />
</unique-constraints>

Dokümanlarda daha fazla ayrıntı:
https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/xml-mapping.html#defining-indexes-or-unique-constraints

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.