复合外键 Laravel

Composite foreign key Laravel

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

我当前的架构如下:

Schema::create('session', 函数 (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/

但是,在这个例子中,他们从一个 table 中提取两个外键,在我上面的例子中你可以看到我需要从两个 "movies" [=44] 中获取数据=] 和 "cinemas" table。我想也许使用 on(array('movies', 'cinema') 会起作用,但它会出现错误 "Array to string conversion"。

我试过删除 (array()) 部分,但那样也行不通。

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

非常感谢,

杰克。

一个外键链接到一个另一个table。所以你需要两个单独的外键,一个用于movies,一个用于cinema

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

此外,我猜您想要在 session table 两个字段 movieIdcinemaId 中的复合索引。如果是这样,您需要决定是否将新的复合索引作为 session 上的 primary 索引。

如果你想让复合索引成为你的主索引,那么你也不需要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');

});

有帮助吗?