सिद्धांत और समग्र अद्वितीय कुंजी


96

मैं सिद्धांत में संयुक्त अद्वितीय कुंजी करना चाहता हूँ। वे मेरे क्षेत्र हैं:

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

मैं सिद्धांत कैसे दिखा सकता हूं, कि एक साथ संयुक्त अद्वितीय कुंजी हैं?

जवाबों:


216

प्रश्न का उत्तर दो:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

@UniqueConstraint देखें


3
जानकारी के लिए धन्यवाद ~ एक नोट के रूप में, यदि आप अपने प्रश्न को हल करते हैं, जबकि आप तुरंत स्वीकार नहीं कर सकते हैं, तो यह आमतौर पर अपने स्वयं के उत्तर को स्वीकार करने का अच्छा रूप है, बस अगर लोग खोज रहे हैं, तो यह दिखाता है कि स्वीकार्य उत्तर है।
रिक्सिअस

2
क्या यह -ToOneसंघों (विदेशी कुंजी) के साथ करना संभव है ?
दिमित्री के

5
मुझे पता है कि यह पुरानी पोस्ट है, लेकिन @Dimitry K यह संभव है। बस आपको अपने @ORM \ JoinColumn (नाम = "join_table_id", referencedColumnName = "id", nullable = false) के रूप में कॉलम नाम का उपयोग करने की आवश्यकता है। यहाँ 'join_table_id' है।
हिरल

ध्यान दें कि आपको कॉलम नाम प्रदान करना है , फ़ील्ड नाम नहीं। तो आपको CamelCase को snake_case में बदलना होगा और _idसंघों के लिए आवेदन करना होगा , क्योंकि यही Doctrine कॉलम नाम बनाता है।
ग्रोनोस्तज

नाम @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})
स्वपोषी

18

मुझे यह useकेवल ओआरएम में और फिर ORMएनोटेशन में उपसर्ग लगता है। यह भी ध्यान दें कि आप एनोटेशन को कई लाइनों तक तोड़ सकते हैं ताकि इसे और अधिक पठनीय बनाया जा सके खासकर यदि आपके पास उल्लेख करने के लिए कई आइटम हैं (नीचे उदाहरण में सूचकांक)।

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

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं समग्र पीके बनाने का तरीका ढूंढते हुए इसके पार आया और सोचा कि यह कुछ अपडेट का उपयोग कर सकता है।

चीजें वास्तव में बहुत सरल हैं अगर आपको क्या चाहिए एक समग्र प्राथमिक कुंजी है। (जो निश्चित रूप से, विशिष्टता की गारंटी देता है) डॉक्ट्रिन प्रलेखन में इस url के कुछ अच्छे उदाहरण हैं: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials-composite-primary-keys.html

तो मूल उदाहरण कुछ इस तरह दिख सकता है:

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

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

यहाँ कुछ नोट:

  1. कॉलम "नाम" को छोड़ दिया गया है क्योंकि डॉक्ट्रिन संपत्ति के नाम के आधार पर इसका अनुमान लगाने में सक्षम है
  2. चूंकि videoDimensionऔर videoBitrateपीके के दोनों भाग हैं - निर्दिष्ट करने की कोई आवश्यकता नहीं हैnullable = false
  3. यदि आवश्यक हो - समग्र पीके विदेशी कुंजियों से बना हो सकता है, इसलिए कुछ संबंधपरक मैपिंग जोड़ने के लिए स्वतंत्र महसूस करें

आपने जो किया वह एक समग्र प्राथमिक कुंजी है। यकीन है कि यह अद्वितीय होगा, लेकिन यह एक प्राथमिक कुंजी है ...;)
प्रीसिनेल

ठीक है, मुझे लगता है कि मैंने अपने उत्तर में उल्लेख किया है :) वास्तव में ओपी के मामले में "यूनिक इंडेक्स" शब्द अधिक उपयुक्त होगा यदि वह पीके बनाने का मतलब नहीं था (जो स्वीकृत उत्तर है)। लेकिन चूंकि प्रश्न में एक अजीब शब्द "समग्र अद्वितीय कुंजी" शामिल है - मैं यह नहीं देखता कि हम इसे एक प्राथमिक प्राथमिक कुंजी क्यों नहीं मान सकते - कम से कम यही तो मैं देख रहा हूं जब मैं इस प्रश्न के पार आया था। चीयर्स!
स्टास पार्शिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.