Soru Doktrin ve kompozit benzersiz anahtarlar


Doktrinde eşsiz bir anahtar yapmak istiyorum. Bunlar benim alanı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 nasıl bir araya getirebilirim, bir araya getirilenler birleşik benzersiz anahtar mıdır?


76
2017-09-28 14:11


Menşei




Cevaplar:


Soruyu cevapla:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Görmek @UniqueConstraint


160
2017-09-29 07:57



Bilgileriniz için teşekkürler ~ Bir not olarak, eğer kendi sorunuzu çözdüyseniz, hemen kabul edemeseniz de, genellikle kendi cevabınızı kabul etmek için iyi bir formdur, sadece insanlar aradıklarında, kabul edilebilir bir cevap olduğu gibi gösterir. - Rixius
İle yapmak mümkün mü -ToOne dernekler (yabancı anahtarlar)? - Dimitry K
Bunun eski yazı olduğunu biliyorum, ama @Dimitry K mümkün. Sadece @ORM \ JoinColumn (name = "join_table_id", namedColumnName = "id", nullable = false) gibi sütun adını kullanmanız gerekir. İşte 'join_table_id'. - herr
Sağlamanız gerektiğini unutmayın kolon isimler, alan adları değil. Yani, camelCase'i snake_case'ye dönüştürmeniz ve eklemelisiniz. _id Dernekler için, çünkü Doktrin sütun isimlerini böyle üretir. - gronostaj
Aynı sorunu YAML kullanarak nasıl çözebilirim? - FortuneSoldier


Onu daha ayrıntılı buluyorum. use sadece ORM ve sonra önek ORM ek açıklamalarda. Ayrıca, birkaç satırdan daha okunabilir olmasını sağlamak için ek açıklamaları kırıp ayırabileceğinizi de unutmayın (özellikle 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={"nane"})
 * })
 */
class VideoSettings

16
2017-11-12 10:14





Bunun eski bir soru olduğunu biliyorum, ancak birleşik PK oluşturmak için bir yol ararken karşılaştım ve bazı güncellemeleri kullanabileceğini düşündüm.

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

Bu yüzden orijinal örnek şöyle bir şeye benzeyebilir:

/**
 * @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. Doctrine dayalı olarak tahmin edebiliyor çünkü "isim" sütun ihmal edilir özellik adı
  2. Dan beri videoDimension ve videoBitrate PK'nin her ikisi de vardır - belirtmeye gerek yoktur nullable = false
  3. Gerekirse - Kompozit PK yabancı anahtarlardan oluşabilir, bu yüzden bazı ilişkisel eşleştirmeler eklemek için çekinmeyin

1
2018-06-08 18:37



Yaptığın şey birleşik bir birincil anahtar. Elbette benzersiz olacak, ama bir birincil anahtar ...;) - Preciel
Evet, sanırım cevabımdan da bahsetmiştim :) Aslında “benzersiz endeks” terimi, PK'yi yaratmak istemediyse OP'nin durumunda daha uygun olurdu (kabul edilen cevap budur). Ancak soruda garip bir terim "bileşik benzersiz anahtar" bulunduğundan - neden birleşik bir birincil anahtar olduğunu varsaymamızı göremiyorum - en azından bu soruya geldiğimde aradığım şey buydu. Şerefe! - Stas Parshin