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

时间:2015-03-23 23:38:59

标签: php database laravel model eloquent

我有一个问题模型,它与答案模型有一对多的关系。

现在我想为这两个模型添加upvote / downvote功能,我是否需要创建两个表,如VotesQuestions和VotesAnswers,或者我可以以某种方式管理一个?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:2)

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

创建一个投票表,并确保它至少有两个特定字段:votable_id和votable_type。在数据库迁移中,您将使用语句$table->morphs('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');
    }
}

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

$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.

答案 1 :(得分:0)

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

ofc你可以使用一个表来处理它,但这确实值得,因为你节省了许多不必要的东西。 你可以用内部id创建一个表,1,2,3,4和1总是问题或0和2-xx(1-xxx)总是答案。所以你可以用一张表来处理它

答案 2 :(得分:0)

您可以创建一个通用投票模型/表,其中包含一个名为“model”和“model_id”的字段,然后使用反射来获取正确的对象。