У меня есть модель вопроса, которая имеет отношение «один-много» к модели «Ответ».
Теперь я хочу добавить funvionality upvote / downvote для обеих этих моделей, мне нужно создать две таблицы, такие как VotesQuestions и VotesAnswers, или я могу каким-то образом справиться с ними? Если да, то как?
Вы можете использовать полиморфные отношения. Это встроено в Laravel. Документация здесь . Код, показанный здесь, относится к 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.
Я бы сделал таблицу для вопроса, и когда вы захотите подняться / понизить вопрос, должен быть столбец count для обоих, в противном случае вы хотите зарегистрировать его, чтобы пользователь мог проголосовать за него один раз, поэтому вам нужна другая таблица для user_id , question_id и тип (вверх / вниз).
ofc вы можете обрабатывать его с помощью одной таблицы, но это действительно стоит, потому что вы сохраняете много вещей, которые не нужны. вы можете создать таблицу с внутренним id, 1,2,3,4 и 1 всегда вопрос или 0 и 2-xx (1-xxx) всегда ответы. поэтому вы можете обрабатывать его с помощью одной таблицы
Вы можете создать общую модель / таблицу Votes, в которой есть поле под названием «model» и «model_id», а затем использовать отражение, чтобы получить правильный объект.