复合外键Laravel

时间:2016-09-28 01:59:25

标签: laravel key composite

我发现很难创建复合外键。我想要一个包含' movieid'和' cinemaid'作为复合外键。这是因为一个会话需要电影和电影院位置。

我目前的架构如下:

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

$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(数组('电影',' cinema')会起作用,但它会出现错误"数组到字符串转换"。

我尝试删除(array())部分,但它也不会那样工作。

如果我不想使用复合外键,我也很乐意听到任何其他解决方案。

非常感谢,

杰克。

1 个答案:

答案 0 :(得分:2)

外键链接到一个其他表。因此,您需要两个单独的外键,一个用于movies,另一个用于cinema

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

另外,我猜你想在session表格中的两个字段movieIdcinemaId上找到复合索引。如果是这样,您需要决定是否将新的复合索引作为session上的主要索引。

如果您希望复合索引成为主索引,那么您也不需要id字段,因此您需要删除$table->increments('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');

});

或者,如果您希望将id保留为主索引,那么您只需要将复合索引作为常规旧索引。所以你可能会这样做:

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');

});

这有帮助吗?