我发现很难创建复合外键。我想要一个包含' 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())部分,但它也不会那样工作。
如果我不想使用复合外键,我也很乐意听到任何其他解决方案。
非常感谢,
杰克。
答案 0 :(得分:2)
外键链接到一个其他表。因此,您需要两个单独的外键,一个用于movies
,另一个用于cinema
。
$table->foreign('movieId')->references('id')->on('movies');
$table->foreign('cinemaId')->references('id')->on('cinema');
另外,我猜你想在session
表格中的两个字段movieId
和cinemaId
上找到复合索引。如果是这样,您需要决定是否将新的复合索引作为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');
});
这有帮助吗?