Intereting Posts
Разбор строки внутри строки? Как я могу получить адрес электронной почты пользователя и имя пользователя из кнопки входа в facebook? Laravel Eloquent: доступ к свойствам и имена динамических таблиц Использование функции htmlspecialchars при подготовке и выполнении PDO Сверхпростой статический файл (html) кэш php сайта Сертификат SSL. Для каких страниц? Медленная производительность MySql в среде Openshift, как получить доступ к базе данных в другом приложении? Как добавить активные состояния и значки в wordpress wp_nav_menu () AES расшифровывается в php Неустранимая ошибка: нельзя повторно назначить автоматически-глобальную переменную _POST Подключение к веб-службе с помощью KSOAP2 – получение исключения XmlPullParserException Как обрабатывать несколько действий с использованием одной html-формы Как получить миниатюру видео в facebook с данного идентификатора видео с помощью php gform_after_submission Сообщение для стороннего API

Laravel, мне нужно несколько таблиц базы данных для голосования на разных моделях

У меня есть модель вопроса, которая имеет отношение «один-много» к модели «Ответ».

Теперь я хочу добавить 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», а затем использовать отражение, чтобы получить правильный объект.