Laravel,我是否需要多个数据库表来对不同模型进行投票

Laravel, do I need multiple database tables for votes on different models

我有一个 Question 模型,它与 Answer 模型具有一对多关系。

现在我想向这两个模型添加 upvote/downvote 功能,我是否需要创建两个表,如 VotesQuestions 和 VotesAnswers,或者我可以用一个来管理吗?如果可以,怎么做?

我会为这个问题做一个table,当你想up/downvote这个问题时,两者都应该有一个计数列,否则你想记录一个用户只能投票对于它一次,所以你需要另一个 table 作为 user_id,question_id 并输入 (up/down).

ofc 你可以用一个 table 来处理它,但这真的很值得,因为你节省了很多不必要的东西。 您可以创建一个带有内部 ID 的 table,1、2、3、4 和 1 始终是问题,或者 0 和 2-xx (1-xxx) 始终是答案。所以你可以用一个 table

来处理

您可以创建一个通用投票 model/table,它有一个名为 "model" 和 "model_id" 的字段,然后使用反射来获取正确的对象。

您可以使用多态关系。这是内置于 Laravel 中的。文档是 here。此处显示的代码适用于 Laravel 4,但功能与 Laravel 5.

相同

创建投票 table,并确保它至少有两个特定字段:votable_id 和 votable_type。在数据库迁移中,您将使用语句 $table->morphs('votable');,它将创建两个字段。您可以拥有任意数量的其他字段,但为了确保关系有效,这两个字段是必需的。

接下来,使用 votable 关系设置投票模型。此关系的名称应与您创建的字段的基本名称匹配:

class Vote extends Eloquent {
    public function votable() {
        return $this->morphTo();
    }
}

通过此设置,您现在可以将投票关联到您想要的任何模型。继续将投票关系添加到问答模型中:

class Question extends Eloquent {
    public function votes() {
        return $this->morphMany('Vote', 'votable');
    }
}

class Answer extends Eloquent {
    public function votes() {
        return $this->morphMany('Vote', 'votable');
    }
}

您现在可以通过以下关系访问任何 question/answer 的投票:

$q = Question::first();
$qVotes = $q->votes; // Collection of votes for the question.

$a = Answer::first();
$aVotes = $a->votes; // Collection of votes for the answer.

您还可以通过投票获得相关的question/answer模型,如果您有需要:

$v = Vote::first();
$vRelated = $v->votable; // Will automatically be a Question or Answer object, depending on what the vote was for.