migrasi laravel pembuat skema unik pada dua kolom


125

Bagaimana cara menetapkan batasan unik pada dua kolom?

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
Tingkat detail ini sayangnya hilang dari dokumen Laravel . Akan sangat mudah untuk menyebutkannya secara sepintas. Detail seperti ini dan - misalnya - fakta bahwa framework selalu menganggap bahwa setiap tabel akan memiliki auto-incrementing id, memberikan framework perasaan amatir di tepinya. Apakah saya mengomel? :-(
cartbeforehorse

Jawaban:


277

Parameter kedua adalah mengatur nama indeks unik secara manual. Gunakan array sebagai parameter pertama untuk membuat kunci unik di beberapa kolom.

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

atau (sedikit lebih rapi)

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

1
+1 terima kasih untuk ini ... tidak yakin bagaimana saya melewatkannya di dokumentasi. Saya harus buta: P
OACDesigns

Saya juga entah bagaimana melewatkan fakta bahwa param kedua adalah memberi nama indeks secara manual dan saya memiliki nama indeks yang dibuat secara otomatis yang terlalu panjang. Terima kasih bung! +1
Ciprian Mocanu

1
1 untuk array(). Karena saya mencoba tanpa array dan tidak berhasil. dapatkah saya memberikan nama batasan saat menjalankan kunci komposit melalui pembuat Skema?
Pankaj

Ya, itu parameter kedua
Collin James

7
Nama indeks yang dihasilkan menggunakan format table_column1_column2...n_uniquejika ada yang tidak yakin. Menghapus batasan unik kemudian akan merujuk pada$table->dropUnique('table_column1_column2...n_unique');
Jonathan

19

Cukup Anda dapat menggunakan

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

Referensi: http://laravel.com/docs/master/migrations#creating-indexes

Sebagai contoh:

    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
Ini tidak menjamin keunikan, itu hanya menambahkan indeks komposit. Biasanya, Anda tidak menginginkan tag yang sama dua kali pada posting yang sama, jadi untuk kasus penggunaan ini lebih baik digunakan ->unique().
okdewit

3
@ Fx32 ini tidak jaminan keunikan karena menciptakan komposit primary key (yang diindeks). Namun, saya masih setuju yang ->unique()lebih tepat dalam pertanyaan khusus ini karena 'mytext'mungkin akan membuat kunci yang buruk seperti kolom VARCHARatau apa pun TEXT. ->primary([])akan sangat bagus untuk memastikan keunikan pada bilangan bulat seperti kunci asing pivot.
Jeff Puckett

2
Perhatikan juga bahwa kunci primer komposit umumnya tidak disukai oleh pengembang Laravel, dan kunci tersebut tidak didukung oleh Eloquent
andrechalom

0
DB::statement("ALTER TABLE `project_majr_actvities`
               ADD UNIQUE `unique_index`(`activity_sr_no`, `project_id`)");

penjelasan lisan akan menjadi tambahan yang berguna untuk jawaban Anda
con
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.