外键如何引用多个主键

时间:2018-08-11 11:54:23

标签: php mysql sql laravel laravel-5.2

enter image description here

我正在Laravel中开发一个系统,用户可以在该系统上发布,回答和投票。

一种方法是为此制作单独的投票表,但我想用一张表作为投票。

我希望投票表中的content_id引用两个主键,即posts.id和post-answers.id

如果该解决方案不可行,则建议替代解决方案。 预先感谢。

我尝试进行此迁移,但没有成功创建表,但是外键仅指向一个主键。

public function up()
{
    Schema::create('contentvotes',function(Blueprint $table){
        $table->increments('id');
        $table->enum('content_type',['post','post_answer']);
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->integer('content_id')->unsigned();
        $table->foreign('content_id')->references('id')->on('posts');
        $table->foreign('content_id')->references('id')->on('postanswers');
        $table->boolean('status');
        $table->timestamps();
    });
}

2 个答案:

答案 0 :(得分:0)

对我来说,我会这样做。不是最佳做法,但这是可能的方法

public class Model {
   ...
   ...

   protected $appends = ['post', 'post_answer']   

   public class getPostAttribute()
   {
        return Post::find($this->attribute('content_id'))
   }

   public class getPostAnswerAttribute()
   {
        return PostAnswer::find($this->attribute('content_id'))
   }


}

答案 1 :(得分:0)

一个外键不能引用多个表中的主键。

例如,您可能具有相同ID的Post A和Post Answer B,数据库如何知道它的ID。

我注意到您有一个content_type列,并且我相信您已经意识到了这个问题。您的content_type和content_id实际上是一个复合外键。同样,它可以引用一个表。

解决方案:您需要引入多态性。您可以将发布和发布答案合并到一个表中并添加类型列。

为了最大程度地减少数据迁移的工作量,您的主键可以是ID和类型。否则,ID是更好的主键。