【问题标题】:Laravel, do I need multiple database tables for votes on different modelsLaravel,我需要多个数据库表来对不同模型进行投票吗
【发布时间】:2015-05-27 03:54:17
【问题描述】:

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

现在我想为这两个模型添加 upvote/downvote funcionality,我需要创建两个表,比如 VotesQuestions 和 VotesAnswers,还是我可以用一个来管理?如果有,怎么做?

【问题讨论】:

    标签: php database laravel model eloquent


    【解决方案1】:

    您可以使用多态关系。这是内置在 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.
    

    【讨论】:

    • 谢谢,正是我需要的。非常感谢详细的解释。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 2014-08-14
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多