【问题标题】:Composite foreign key Laravel复合外键 Laravel
【发布时间】:2017-05-09 14:32:28
【问题描述】:

我发现创建复合外键很困难。我想要一个同时具有“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/

然而,在这个例子中,他们从一个表中提取两个外键,在我上面的例子中,你可以看到我需要从“movies”表和“cinemas”表中获取数据。我想也许使用 on(array('movies', 'cinema') 会起作用,但它会出现错误“数组到字符串转换”。

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

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

非常感谢,

杰克。

【问题讨论】:

    标签: laravel key composite


    【解决方案1】:

    外键链接到 一个 其他表。所以你需要两个独立的外键,一个用于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');
    
    });
    

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多