15

2 つの複合主キーが必要ですがAUTO INCREMENT、これまでに試したのは 1 つだけです。

// first try 
Schema::create("kitchen", function($table) {
                $table->increments('id');
                $table->integer('restaurant_id');
                $table->primary(array('id', 'restaurant_id'));
                $table->string('name');
            });
// second try
 Schema::create("kitchen", function($table) {
                $table->increments('id');
                $table->integer('restaurant_id');
                $table->primary('restaurant_id');
                $table->string('name');
            });

どれも機能しません。エラーメッセージ:

[Exception]
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary ke
y defined (SQL: alter table
キッチンレストラン_idadd primary key kitchen_restaurant_id
_primary(
)) (Bindings: array (
))

ビルダーなしのソリューションSchema: まず、2 つの複合主キーを追加する必要があり、次にそのうちの 1 つを作成する必要がありますが、ビルダーではこれができないAUTO INCREMENTと思います。Schema

注: SQLでこれを行うことができます。つまり、MySQL では問題ありません。

助言がありますか?

概要:

私が必要なのは;

http://oi39.tinypic.com/es91ft.jpg

Schemaビルダー付き

4

6 に答える 6

15

これは、未準備のメソッドの助けを借りて行うことができます。

Schema::create("kitchen", function($table) {
    $table->increments('id');
    $table->integer('restaurant_id');
    $table->string('name');
});

DB::unprepared('ALTER TABLE `kitchen` DROP PRIMARY KEY, ADD PRIMARY KEY (  `id` ,  `restaurant_id` )');

これはテスト済みで、動作します。

少し遅れていることはわかっています。あなたは先に進んだかもしれませんが、他の誰かがこれに遭遇する可能性があります:)

于 2013-11-17T16:51:38.760 に答える
7

自動インクリメントを複合主キーの一部として持つことは意味がありません。とにかく、すべてのレコードで一意になるからです。たとえば、「restaurant_id」や「name」などの他の 2 つの列に、自動インクリメントの主キーと一意の複合キーが必要な場合:

Schema::create("kitchen", function($table) 
{
    $table->increments('id');
    $table->integer('restaurant_id');
    $table->string('name');
    $table->unique(['restaurant_id', 'name']);
});
于 2016-03-31T16:00:56.060 に答える
6

Eloquent の increments() は、列を符号なし整数として設定します。それを念頭に置いて、目的の複合キーを実現する方法は複数あります。

interger() または unsignedInteger() のいずれかを使用して、autoIncrements を true に設定できます。

 $table->integer($column, $autoIncrement = false, $unsigned = false);

 $table->unsignedInteger($column, $autoIncrement = false);
 //Returns $this->integer($column, $autoIncrement, true);

次に、primary() を介して、どれが主キーであるかを Eloquent に伝えることができます。

Schema::create() は次のようになります。

 Schema::create('kitchen', function($table) {
     $table->integer('id', true, true);
     $table->integer('restaurant_id')->unsigned(); //or $table->integer('restaurant_id', false, true);
     $table->foreign('restaurant_id')
           ->references('id')->on('restaurants')
           ->onDelete('cascade');
     $table->string('name');
     $table->primary(array('id', 'restaurant_id'));
 });

Restaurant テーブルが $table->increments('id') を使用していると仮定すると、'id' と 'restaurant_id' が主キーになり、'restaurant_id' が Restaurant テーブルの 'id' に一致するはずです。

于 2014-11-17T20:16:52.983 に答える
2

Dayle Reesの別のオプション

Schema::create('example', function($table)
{
    $table->integer('id');
    $table->string('username');
    $table->string('email');
    $keys = array('id', 'username', 'email');
    $table->primary($keys);
});
于 2014-05-11T06:56:28.430 に答える
1

->increments()すでに設定されているため、Laravel では現在不可能なことにヒットしたようです。->primary()そのため、自分で追加するとPRIMARY、結果の SQL に 2 つの句が作成されます。

ただし、間違った主キーでテーブルを作成し、削除してから再作成してみてください。

Schema::create("kitchen", function($table) 
{
    $table->increments('id');
    $table->integer('restaurant_id');
    $table->string('name');
});

Schema::table('kitchen', function($table)
{
    $table->dropPrimary('kitchen_id_primary');
});

Schema::table('kitchen', function($table)
{
    $table->primary(array('id', 'restaurant_id'));
});
于 2013-06-12T18:41:00.573 に答える
0

このように試すことができます

Schema::create("kitchen", function($table) 
{
  $table->integer('id');
  $table->integer('restaurant_id');
  $table->string('name');
}); 
Schema::table('kitchen', function($table)
{
  $table->primary(array('id', 'restaurant_id'));
});
Schema::table('pamenus', function ($table) 
{
    $table->increments('xsl')->change();
});

doctrine/dbal パッケージをインストールしていない場合。最初に doctrine/dbal パッケージをインストールしてください。テーブルの列を変更するには doctrine/dbal パッケージが必要です。フレームワークのルート ディレクトリで次のコマンドを実行します。

composer require doctrine/dbal
于 2021-06-27T15:49:06.933 に答える