Laravel,我需要多个不同模型的投票数据库表吗


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

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

现在我想为这两个模型添加upvote/downvote功能,我需要创建两个表,如VotesQuestions和VotesAnwers,还是可以用一个表来管理?如果是,如何?

您可以使用多态关系。这是Laravel内置的。文档在这里。这里显示的代码适用于Laravel 4,但功能与Laravel 5相同。

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

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

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');
    }
}

您现在可以通过以下关系访问任何问题/答案的投票:

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

如果你需要的话,你也可以通过投票获得相关的问答模型:

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

我会为这个问题做一个表,当你想向上/向下投票时,应该有一个计数列来记录这两个问题,否则你想记录用户只能投票一次,所以你需要另一个表来记录user_id、question_id和type(向上/向下)。

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

您可以创建一个通用的Votes模型/表,其中有一个名为"model"answers"model_id"的字段,然后使用反射来获得正确的对象。