स्कीमा बिल्डर लारवेल माइग्रेशन दो स्तंभों पर अद्वितीय है


125

मैं दो स्तंभों पर एक अद्वितीय बाधा कैसे निर्धारित कर सकता हूं?

class MyModel extends Migration {
  public function up()
  {
    Schema::create('storage_trackers', function(Blueprint $table) {
      $table->increments('id');
      $table->string('mytext');
      $table->unsignedInteger('user_id');
      $table->engine = 'InnoDB';
      $table->unique('mytext', 'user_id');
    });
  }
}

MyMode::create(array('mytext' => 'test', 'user_id' => 1);
// this fails??
MyMode::create(array('mytext' => 'test', 'user_id' => 2);


1
विवरण का यह स्तर लारावेल डॉक्स से दुखी है । इसे पारित करने में उल्लेख करना इतना आसान होगा। इस तरह के विवरण और - उदाहरण के लिए - यह तथ्य कि रूपरेखा हमेशा यह मानती है कि प्रत्येक तालिका में ऑटो-इन्क्रिमिंग होने वाली है id, रूपरेखा को किनारों के चारों ओर एक शौकिया भावना दे। क्या मैं रंटिंग हूं? :-(
कार्टिफ़ोर्सहोर्स

जवाबों:


277

दूसरे पैराम को यूनिक इंडेक्स का नाम मैन्युअल रूप से सेट करना है। कई कॉलमों में अद्वितीय कुंजी बनाने के लिए पहले परम के रूप में एक सरणी का उपयोग करें।

$table->unique(array('mytext', 'user_id'));

या (थोड़ा नटखट)

$table->unique(['mytext', 'user_id']);

1
+1 इसके लिए धन्यवाद ... यकीन नहीं होता कि मैंने इसे प्रलेखन में कैसे याद किया। मुझे अंधा होना चाहिए: P
OACDesigns

मैं भी किसी तरह से इस तथ्य को याद कर रहा था कि दूसरा परम सूचकांक को मैन्युअल रूप से नाम देना है और मेरे पास स्वचालित रूप से उत्पन्न सूचकांक नाम था जो बहुत लंबा था। श्रीमान धन्यवाद! +1
सिप्रियन मोकेनू

1
के लिए +1 array()। क्योंकि मैंने बिना एरे के कोशिश की और यह काम नहीं आया। स्कीमा बिल्डर के माध्यम से कंपोजिट कुंजी चलाते समय क्या मैं बाधा नाम दे सकता हूं?
पंकज

हाँ, यह दूसरा परम है
Collin James

7
table_column1_column2...n_uniqueयदि कोई अनिश्चित है तो उत्पन्न सूचकांक नाम प्रारूप में हैं । अद्वितीय बाधा को गिराना तब संदर्भित होगा कि$table->dropUnique('table_column1_column2...n_unique');
योनातन

19

बस आप उपयोग कर सकते हैं

$table->primary(['first', 'second']);

संदर्भ: http://laravel.com/docs/master/migrations#creating-indexes

उदहारण के लिए:

    Schema::create('posts_tags', function (Blueprint $table) {

        $table->integer('post_id')->unsigned();
        $table->integer('tag_id')->unsigned();

        $table->foreign('post_id')->references('id')->on('posts');
        $table->foreign('tag_id')->references('id')->on('tags');

        $table->timestamps();
        $table->softDeletes();

        $table->primary(['post_id', 'tag_id']);
    });

4
यह विशिष्टता की गारंटी नहीं देता है, यह सिर्फ एक संयुक्त सूचकांक जोड़ता है। आमतौर पर, आप एक ही पोस्ट पर एक ही टैग को दो बार नहीं चाहते हैं, इसलिए इस उपयोग के मामले के लिए इसका उपयोग करना बेहतर है ->unique()
ओकेडिट

3
@ Fx32 इस करता है , क्योंकि यह एक समग्र बनाता गारंटी विशिष्टता प्राथमिक कुंजी (जो अनुक्रमित है)। हालाँकि, मैं अभी भी सहमत हूं कि ->unique()इस विशिष्ट प्रश्न में अधिक उपयुक्त है क्योंकि 'mytext'संभवतः एक खराब कुंजी के लिए कोई भी VARCHARया TEXTस्तंभ होगा। ->primary([])पूर्णांक विदेशी कुंजियों जैसे पूर्णांक पर विशिष्टता सुनिश्चित करने के लिए बहुत अच्छा होगा।
जेफ पकेट

2
यह भी ध्यान दें कि मिश्रित प्राथमिक कुंजियाँ आमतौर पर
लारवेल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.