我正在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();
});
}
答案 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是更好的主键。