iki sütunda benzersiz şema oluşturucu laravel geçişleri


125

İki sütunda benzersiz bir kısıtlamayı nasıl ayarlayabilirim?

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
Bu ayrıntı düzeyi ne yazık ki Laravel belgelerinde eksik . Bundan bahsetmek çok kolay olurdu. Bunun gibi ayrıntılar ve - örneğin - çerçevenin her zaman her tablonun otomatik olarak artacağını varsaydığı gerçeği, çerçeveye idkenarlarda amatör bir his verir. Mırıldanıyor muyum? :-(
cartbeforehorse

Yanıtlar:


277

İkinci parametre, benzersiz dizinin adını manuel olarak ayarlamaktır. Birden çok sütun arasında benzersiz bir anahtar oluşturmak için ilk parametre olarak bir dizi kullanın.

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

veya (biraz temiz)

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

1
Bunun için +1 teşekkürler ... belgelerde bunu nasıl kaçırdığımdan emin değilim. Kör olmalıyım: P
OACDesigns

Ayrıca, ikinci parametrenin dizini manuel olarak adlandırmak olduğu gerçeğini de bir şekilde kaçırdım ve çok uzun olan otomatik olarak oluşturulmuş bir dizin adım vardı. Teşekkür ederim dostum! +1
Ciprian Mocanu

1
+1 array(). Çünkü dizisiz denedim ve işe yaramadı. Kompozit anahtarı Schema builder aracılığıyla çalıştırırken kısıtlama adı verebilir miyim?
Pankaj

Evet, bu ikinci param
Collin James

7
table_column1_column2...n_uniqueHerhangi biri emin değilse , oluşturulan dizin adları biçimindedir . Eşsiz kısıtlamayı kaldırmak o zaman buna atıfta bulunacaktır$table->dropUnique('table_column1_column2...n_unique');
Jonathan

19

Basitçe kullanabilirsiniz

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

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

Örnek olarak:

    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
Bu benzersizliği garanti etmez, sadece bileşik bir indeks ekler. Genellikle, aynı gönderide aynı etiketi iki kez istemezsiniz, bu nedenle bu kullanım durumu için kullanmak daha iyidir ->unique().
okdewit

3
Fx32 @ bu does bir kompozit oluşturduğundan garanti benzersizliğini birincil anahtar (dizine). Bununla birlikte, yine ->unique()de bu özel soruda bunun daha uygun olduğuna katılıyorum çünkü 'mytext'muhtemelen herhangi bir sütun VARCHARveya TEXTsütun gibi kötü bir anahtar oluşturacaktır . ->primary([])pivot yabancı anahtarlar gibi tam sayılarda benzersizliği sağlamak için harika olurdu.
Jeff Puckett

2
Ayrıca, bileşik birincil anahtarların Laravel geliştiricileri tarafından genellikle hoş karşılanmadığını ve Eloquent tarafından desteklenmediklerine dikkat edin - bkz. Github.com/laravel/framework/issues/5355
andrechalom

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

sözlü açıklama Cevabınız için yararlı bir katkı olacaktır
con
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.