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);
pengguna391986
sumber
Kemungkinan duplikat dari Laravel 4: membuat kombinasi nilai / kolom menjadi unik
Pengacara Organik
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']);
Collin James
sumber
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']);
    });
İsmail Atkurt
sumber
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`)");
Rajendra Rajput
sumber
penjelasan lisan akan menjadi tambahan yang berguna untuk jawaban Anda
con