2015-12-12 6 views
1

Это скорее концептуальный вопрос, но я пытаюсь найти лучший способ сделать представление, которое отображает один вопрос викторины за раз и проверяет ответ.Laravel 5 Quiz Project

В настоящее время моя таблица MySQL имеет следующие столбцы: id, category_id, quiz_question, answer_one, answer_two, answer_three, correct_answer.

Мой контроллер использует следующие, чтобы получить вопросы викторины:

$quizzes = Quiz::where('category_id',$category_id)->simplePaginate(1); 

На мой взгляд, я иду через процесс делать asnwer заказа вручную

{{$quiz->quiz_question }} 

<a onclick="this.innerHTML='Wrong'">{{ $quiz->answer_one }}</a> 
<a onclick="this.innerHTML='Right'">{{ $quiz->correct_answer }}</a> 
<a onclick="this.innerHTML='Wrong'">{{ $quiz->answer_two }}</a>...etc. 

и, вероятно, только собирается используйте JavaScript/JQuery, чтобы проверить правильный ответ.

Концептуально это кажется довольно плохим способом сделать это, и я до сих пор не уверен, как рандомизировать порядок ответов, если они из той же таблицы БД, как это. В целом, есть лучший способ сделать это (отобразить вопрос 1 вопрос и отобразить ответы в случайном порядке, проверить без запроса БД)? Заранее спасибо.

ответ

2

Не оставляйте ответы на стороне клиента в любой форме.

Вместо этого просто задайте вопросы и разбивайте их по страницам на стороне клиента. Если вам абсолютно необходимо проверять ответы один за другим, запустите AJAX-запросы.

Или вы можете просто позволить человеку попробовать всю викторину и опубликовать вопросы с ответами пользователей и проверить их на стороне сервера. Затем вы возвращаете результат/счет/ответы.

Что касается вашего запроса о проверке без запроса БД, вы не должны этого делать. Если вам это абсолютно необходимо, сохраните ответы в объекте, а не в DOM. Опять же, это не может быть больше «не рекомендуется».

Edit:

Вы должны сначала разделить его на эти таблицы. Вы не можете рандомизировать порядок отображения параметров без взлома из первой таблицы.

И не называйте столбцы как answer_one, answer_two, answer_three, correct_answer. Таким образом, единственный способ распознать ответ по имени столбца correct_answer. Имя столбца не должно давать подсказки о правильном ответе. Он должен храниться где-то в другом месте.

  1. вопросы

    id 
    question - the question body 
    
  2. категории

    id 
    category - name of the category 
    
  3. question_categories (один вопрос может принадлежать нескольким категориям)

    id 
    question_id 
    category_id 
    
  4. оп ЦИИ

    id 
    question_id 
    option - option text 
    
  5. отвечает

    id 
    question_id 
    option_id 
    

Теперь то, что вы делаете, вы рандомизации порядок вариантов

$questions = Question::where('category_id', $category_id)-> 
      with(['options' => function ($query) { 
       $query->orderBy(DB::raw('RAND()')); 
      }]) 
      ->get(); 

Чтобы случайно заказать варианты мы использовали ORDER BY RAND().

Теперь вы просто отправляете option_id и можете проверить, является ли он правильным ответом на стороне сервера.

Edit - 27 марта

Вы можете использовать следующие модели.

  1. Вопрос
  2. QuestionCategory
  3. Категория
  4. Опция
  5. Ответ

Вы можете использовать следующие соотношения.

  1. Вопрос belongsTo QuestionCategory
  2. QuestionCategory belongsTo Категория
  3. Вопрос hasMany Вариант
  4. Вопрос hasOne Ответ

Но создание модели QuestionCategory не очень хорошо масштабируется. Поэтому, если вы не хотите этого делать, вы можете использовать Полиморфные отношения. Вы можете использовать таблицу категорий для хранения в основном всех типов категорий, а не только категорий вопросов. В этом случае вам необходимо изменить таблицы categories, чтобы добавить тип таксономии. Если вы не понимаете какой-либо из этих вещей, связанных с полиморфными отношениями, пожалуйста, найдите его в официальной документации Laravel. https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

+0

Хорошо спасибо, можете ли вы случайно узнать лучший способ рандомизировать ответы, если они поступают из одной таблицы, например это? –

+0

@ AnthonyPham - Вы не можете выполнить рандомизацию в запросе напрямую, если они из одной таблицы. Вам нужно сделать это на уровне приложения, например. 'shuffle()' в PHP. Для лучшего решения обратитесь к отредактированному разделу выше. – user2040026

+0

@ AnthonyPham вы можете помочь мне разобраться, как решить эту проблему на модели?Модель принадлежит? – manshu

Смежные вопросы