当前位置: 首页 > 知识库问答 >
问题:

复合外键Laravel

宓英哲
2023-03-14

我发现很难创建复合外键。我想要一个会话表,它同时具有'movieid'和'cinemaid'作为复合外键。这是因为一个会话需要电影和电影院位置。

我当前的模式如下所示:

Schema::create('session',函数(Blueprint$表){

$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/

但是,在本例中,它们从一个表中提取两个外键,在上面的示例中,您可以看到我需要从“movies”表和“cinemas”表中获取数据。我想也许使用on(array('movies','cinema')可以工作,但它出现了错误“array-to-string-conversion”。

我已尝试删除(array())部分,但也不起作用。

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

非常感谢,

杰克。

共有1个答案

钱安和
2023-03-14

外键链接到另一个表。所以你需要两个独立的外键,一个用于电影,一个用于电影

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

另外,我猜您希望在会话表中的两个字段moviIdCinemaId上有一个复合索引。如果是这样,您需要决定是否将新的复合索引作为会话上的主要索引。

如果希望复合索引成为主索引,则不需要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');

});

这有用吗?

 类似资料:
  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?

  • 问题内容: 这是我的两个关注表: 我想在“组”中创建一个字段,该字段将链接到“教程”中的复合唯一键。所以我想我的问题是,如何关联这些表?我必须为“教程”中的每个主键在“组”中创建外键字段吗? 问题答案: 根据mySQL文档,您应该能够设置到组合的外键映射,这将要求您创建多个列。 添加列并将其放在表格中 正如史蒂文(Steven)在以下注释中提到的那样,您应该尝试重新构造它,以便教程表使用实际的主键

  • 问题内容: 我有一个类似的问题,如下所示,但解决方案无法解决我的问题。 休眠复合主键包含复合外键,如何映射 我正在尝试加入2个表,每个表都有一个带有部分外键引用的复合主键。 在一个: 在BPK中: 上面的方法给我这个异常: 你能帮忙吗? 问题答案: 假设f1和F2唯一标识A并存在于APK中,则可以通过几种方式使用JPA 2.0的派生ID。最容易显示的是: 这里的关键点是B对A的引用控制了外键字段f

  • 问题内容: 我有一个类似的问题,如下所示,但解决方案无法解决我的问题。 休眠复合主键包含复合外键,如何映射 我正在尝试加入2个表,每个表都有一个带有部分外键引用的复合主键。 在一个: 在BPK中: 上面的方法给我这个异常: 你能帮忙吗? 问题答案: 假设f1和F2唯一标识A并存在于APK中,则可以通过几种方式使用JPA 2.0的派生ID。最容易显示的是: 这里的关键点是B对A的引用控制了外键字段f

  • 我有一个类似的问题如下,但解决方案没有解决我的问题。 hibernate复合主键包含复合外键,如何映射此 我试图连接2个表,每个表都有一个复合主键和部分外键引用。 你能帮忙吗?

  • 问题内容: 我在oracle的1个表中有一个复合主键。我想为第二个表中的一个表项创建一个外键,该表项引用第一个表中的复合主键。我收到错误ORA-02256。关于如何输入此内容有任何想法吗? 问题答案: 该错误是因为FOREIGN KEY是一列,但是您尝试提供两列作为父列。不需要绑定到复合键,因为它没有列… 您也有倒退的关系-使用: 我将为要来自的任何表添加一个外键约束。