复合外键 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 两个字段 movieId
和 cinemaId
中的复合索引。如果是这样,您需要决定是否将新的复合索引作为 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');
});
有帮助吗?
我发现很难创建复合外键。我想要一个将 '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 两个字段 movieId
和 cinemaId
中的复合索引。如果是这样,您需要决定是否将新的复合索引作为 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');
});
有帮助吗?