我在拉威尔的一个系统上工作,在这个系统中,用户可以发布、回答和投票。
一种方法是制作单独的投票表,但我想用一张表作为投票表。
我希望投票表中的content\u 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条答案
按热度按时间8fsztsew1#
对我来说,我会这样做。不是最佳实践,但这是可行的方法
k2fxgqgv2#
一个外键不能引用多个表中的主键。
例如,post a和post answer b可能具有相同的id,数据库如何知道它是哪个id。
我注意到你有一个内容类型的专栏,我相信你已经意识到这个问题。内容类型和内容id实际上是一个复合外键。同样,它可以引用一个表。
解决方案:你需要引入多态性。您可以将post和postanswer合并到一个表中并添加类型列。
为了尽量减少数据迁移的工作量,您的主键可以是id和type。否则,id是更好的主键。