การย้ายข้อมูล laravel ของตัวสร้างสคีมาจะไม่ซ้ำกันในสองคอลัมน์


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
ระดับของรายละเอียดนี้จะเศร้าหายไปจากเอกสาร Laravel มันจะง่ายมากที่จะพูดถึงมันเมื่อผ่านไป รายละเอียดเช่นนี้และ - ตัวอย่างเช่นความจริงที่ว่าเฟรมเวิร์กมักจะสมมติว่าทุกตารางจะมีการเพิ่มขึ้นอัตโนมัติidทำให้กรอบความรู้สึกแบบมือสมัครเล่นรอบ ๆ ขอบ ฉันคุยโว? :-(
cartbeforehorse

คำตอบ:


277

พารามิเตอร์ที่สองคือการตั้งชื่อของดัชนีเฉพาะด้วยตนเอง ใช้อาร์เรย์เป็นพารามิเตอร์แรกเพื่อสร้างคีย์เฉพาะในหลายคอลัมน์

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

หรือ (เล็กน้อยกว่า)

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

1
+1 ขอบคุณสำหรับสิ่งนี้ ... ไม่แน่ใจว่าฉันพลาดในเอกสารนี้ไปได้อย่างไร ฉันต้องตาบอด: P
OACDesigns

ฉันยังพลาดความจริงที่ว่าพารามิเตอร์ที่สองคือการตั้งชื่อดัชนีด้วยตนเองและฉันมีชื่อดัชนีที่สร้างขึ้นโดยอัตโนมัติซึ่งยาวเกินไป ขอบคุณผู้ชาย! +1
Ciprian Mocanu

1
+1 สำหรับarray(). เพราะฉันลองโดยไม่ใช้อาร์เรย์และมันไม่ได้ผล ฉันสามารถตั้งชื่อข้อ จำกัด ในขณะที่เรียกใช้คีย์ผสมผ่านตัวสร้าง Schema ได้หรือไม่
Pankaj

ใช่นั่นคือพาราตัวที่สอง
Collin James

7
ชื่อดัชนีที่สร้างขึ้นจะอยู่ในรูปแบบtable_column1_column2...n_uniqueหากใครไม่แน่ใจ การลดข้อ จำกัด ที่เป็นเอกลักษณ์จะอ้างอิงถึงสิ่งนั้นใน$table->dropUnique('table_column1_column2...n_unique');
Jonathan

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()โดยปกติแล้วคุณไม่ต้องการแท็กเดียวกันสองครั้งในการโพสต์เดียวกันดังนั้นสำหรับกรณีการใช้งานนี้ดีกว่าที่จะใช้
okdewit

3
@ Fx32 นี้ไม่เอกลักษณ์รับประกันเพราะมันจะสร้างคอมโพสิตคีย์หลัก (ซึ่งก็คือการจัดทำดัชนี) อย่างไรก็ตามฉันยังเห็นด้วยว่า->unique()เหมาะสมกว่าในคำถามเฉพาะนี้เพราะ'mytext'อาจจะทำให้คีย์ไม่ถูกต้องเช่นเดียวกับคอลัมน์ใด ๆVARCHARหรือTEXTคอลัมน์ ->primary([])จะดีมากสำหรับการรับรองความเป็นเอกลักษณ์ของเลขจำนวนเต็มเช่นแป้นต่างประเทศหมุน
Jeff Puckett

2
นอกจากนี้โปรดสังเกตว่าโดยทั่วไปคีย์หลักแบบคอมโพสิตมักจะขมวดคิ้วโดยนักพัฒนา Laravel และ Eloquent ไม่ได้รับการสนับสนุนโปรดดูที่github.com/laravel/framework/issues/5355
andrechalom

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.