2016-09-28 26 views
0

複合外部キーを作成するのが難しいです。私は両方の 'movieid'と 'cinemaid'を複合的な外部キーとして持つセッションテーブルが必要です。これは、1つのセッションで映画と映画の両方の場所が必要になるためです。複合外部キーLaravel

私の現在のスキーマはfolllowing:

スキーマ::( 'セッション'、関数(青写真$表){

$table->increments('id'); 
$table->integer('movieId'); 
$table->integer('cinemaId'); 
$table->foreign(array('movieId', 'cinemaId'))->references(array('id', 'id'))->on(array('movies', 'cinema')); 
$table->dateTime('time'); 

を})を作成します。

laravelで複合外部キーを作成する方法に関する多くの情報が見つかりません。私が見つけた最高のもの:

http://www.geexie.com/composite-primary-foreign-keys-laravel/

ただし、この例では、彼らは私の上記の例のどこ-としてあなたは、私は両方からデータを取得する必要があることがわかります、一つのテーブルの両方から外部キーを引っ張ります"映画"テーブルと "映画"テーブル。私はおそらくon(array( 'movies'、 'cinema')を使用していると思いますが、 "Array to string conversion"エラーが発生します)しかし、それはどちらかそのように動作しません。私は、複合外部キーを使用していると仮定していないよ場合、私はまた、任意の代替ソリューションを聞いて幸せになると思います

おかげでたくさんの、

ジャック

答えて

0

外部キーからへのリンク他のテーブル。したがって、2つの別個の外部キーが必要です.1つはmovies、もう1つはcinemaです。

$table->foreign('movieId')->references('id')->on('movies'); 
$table->foreign('cinemaId')->references('id')->on('cinema'); 

また、私は2つのフィールドmovieIdcinemaIdに、あなたはsessionテーブルに複合インデックスをしたい推測しています。その場合は、新しい複合インデックスをプライマリインデックスsessionに設定するかどうかを決定する必要があります。

複合インデックスをプライマリインデックスにする場合は、idフィールドも必要ないため、$table->increments('id')行を削除する必要があります。プライマリインデックスとしてidを維持したい場合は、あなただけのコンポジットインデックスは定期的に古いインデックスになりたい、

Schema::create('session', function (Blueprint $table) { 

$table->integer('movieId'); 
$table->integer('cinemaId'); 
$table->primary(['movieId', 'cinemaId']); // note, this is a *primary* key 
$table->foreign('movieId')->references('id')->on('movies'); 
$table->foreign('cinemaId')->references('id')->on('cinema'); 
$table->dateTime('time'); 

}); 

または:あなたはこのようなものに終わるだろう。だからこのようなことをするかもしれません:

Schema::create('session', function (Blueprint $table) { 

$table->increments('id'); 
$table->integer('movieId'); 
$table->integer('cinemaId'); 
$table->index(['movieId', 'cinemaId']); // This is an index, but *not* a primary key 
$table->foreign('movieId')->references('id')->on('movies'); 
$table->foreign('cinemaId')->references('id')->on('cinema'); 
$table->dateTime('time'); 

}); 

これは役に立ちますか?

+0

ありがとうブレンダンこれは7か月前から:) –