Классифицируйте ответы на вопрос по варианту и подсчитайте, сколько людей ответили на вопрос с помощью указанного варианта. - PullRequest
0 голосов
/ 11 декабря 2019

Это данные из базы данных, которые я пытаюсь классифицировать и классифицировать, я поставил один вопрос с ответами для каждого типа: текст, да или нет, множественный выбор, рейтинг.

{ 
   "id":1,
   "name":"Evaluacion al docente por parte de los estudiantes",
   "description":"Evaluacion al docente de la clase de Electronica 1 de la carrera de Ingenieria",
   "user_id":1,
   "anonymous":0,
   "created_at":"2019-12-09 10:30:50",
   "updated_at":"2019-12-10 08:43:40",
   "survey_questions":[ 
      { 
         "id":1,
         "question":"Cual es su opinion acerca de la oficina de telematica",
         "user_id":1,
         "survey_section_id":1,
         "response_type_id":1,
         "optional":0,
         "num":null,
         "rank":null,
         "show_text":0,
         "created_at":"2019-12-09 10:29:27",
         "updated_at":"2019-12-10 08:20:50",
         "pivot":{  },
         "response_type":{ 
            "id":1,
            "type":"Texto"
         },
         "survey_question_option":[ 

         ],
         "answer":[ 
            { 
               "id":1,
               "survey_id":1,
               "survey_question_id":1,
               "user_id":2,
               "answer":"muy bien",
               "created_at":"2019-12-10 08:25:12",
               "updated_at":"2019-12-10 08:25:12"
            },
            { 
               "id":7,
               "survey_id":1,
               "survey_question_id":1,
               "user_id":3,
               "answer":"fd asdf asdfasddsaf",
               "created_at":"2019-12-10 08:25:59",
               "updated_at":"2019-12-10 08:25:59"
            },
            { 
               "id":13,
               "survey_id":1,
               "survey_question_id":1,
               "user_id":4,
               "answer":"lkklj i klike lakd aoiadlkj askfj askfjoaweij alkd aksdf asd",
               "created_at":"2019-12-10 08:28:17",
               "updated_at":"2019-12-10 08:28:17"
            },
            { 
               "id":19,
               "survey_id":1,
               "survey_question_id":1,
               "user_id":5,
               "answer":"l kdf jalskdf jalsdf afdsf afd ds lkdsjflak jaf",
               "created_at":"2019-12-10 08:28:51",
               "updated_at":"2019-12-10 08:28:51"
            }
         ]
      },
      { 
         "id":2,
         "question":"elija 3 opciones",
         "user_id":1,
         "survey_section_id":1,
         "response_type_id":2,
         "optional":0,
         "num":3,
         "rank":null,
         "show_text":0,
         "created_at":"2019-12-10 08:21:21",
         "updated_at":"2019-12-10 08:21:21",
         "pivot":{ 
            "survey_id":1,
            "survey_question_id":2
         },
         "response_type":{ 
            "id":2,
            "type":"Selecci\u00f3n M\u00faltiple"
         },
         "survey_question_option":[ 
            { 
               "id":1,
               "option":"opcion a",
               "survey_question_id":2,
               "created_at":null,
               "updated_at":null
            },
            { 
               "id":2,
               "option":"opcion b",
               "survey_question_id":2,
               "created_at":null,
               "updated_at":null
            },
            { 
               "id":3,
               "option":"opcion c",
               "survey_question_id":2,
               "created_at":null,
               "updated_at":null
            },
            { 
               "id":4,
               "option":"opcion d",
               "survey_question_id":2,
               "created_at":null,
               "updated_at":null
            }
         ],
         "answer":[ 
            { 
               "id":2,
               "survey_id":1,
               "survey_question_id":2,
               "user_id":2,
               "answer":"1",
               "created_at":"2019-12-10 08:25:12",
               "updated_at":"2019-12-10 08:25:12"
            },
            { 
               "id":8,
               "survey_id":1,
               "survey_question_id":2,
               "user_id":3,
               "answer":"3",
               "created_at":"2019-12-10 08:25:59",
               "updated_at":"2019-12-10 08:25:59"
            },
            { 
               "id":14,
               "survey_id":1,
               "survey_question_id":2,
               "user_id":4,
               "answer":"4",
               "created_at":"2019-12-10 08:28:17",
               "updated_at":"2019-12-10 08:28:17"
            },
            { 
               "id":20,
               "survey_id":1,
               "survey_question_id":2,
               "user_id":5,
               "answer":"4",
               "created_at":"2019-12-10 08:28:51",
               "updated_at":"2019-12-10 08:28:51"
            }
         ]
      },
      { 
         "id":3,
         "question":"bota la basura en los basureros?",
         "user_id":1,
         "survey_section_id":2,
         "response_type_id":4,
         "optional":1,
         "num":null,
         "rank":null,
         "show_text":0,
         "created_at":"2019-12-10 08:21:52",
         "updated_at":"2019-12-10 08:21:52",
         "pivot":{  },
         "response_type":{ 
            "id":4,
            "type":"Si o No"
         },
         "survey_question_option":[ 

         ],
         "answer":[ 
            { 
               "id":4,
               "survey_id":1,
               "survey_question_id":3,
               "user_id":2,
               "answer":"No",
               "created_at":"2019-12-10 08:25:12",
               "updated_at":"2019-12-10 08:25:12"
            },
            { 
               "id":10,
               "survey_id":1,
               "survey_question_id":3,
               "user_id":3,
               "answer":"Si",
               "created_at":"2019-12-10 08:25:59",
               "updated_at":"2019-12-10 08:25:59"
            },
            { 
               "id":16,
               "survey_id":1,
               "survey_question_id":3,
               "user_id":4,
               "answer":"No",
               "created_at":"2019-12-10 08:28:17",
               "updated_at":"2019-12-10 08:28:17"
            }
         ]
      },
      { 
         "id":4,
         "question":"Que calificacion le daria a la limpieza general de la universidad?",
         "user_id":1,
         "survey_section_id":2,
         "response_type_id":3,
         "optional":0,
         "num":null,
         "rank":6,
         "show_text":1,
         "created_at":"2019-12-10 08:22:37",
         "updated_at":"2019-12-10 08:22:37",
         "pivot":{  },
         "response_type":{ 
            "id":3,
            "type":"Rango"
         },
         "survey_question_option":[ 

         ],
         "answer":[ 
            { 
               "id":5,
               "survey_id":1,
               "survey_question_id":4,
               "user_id":2,
               "answer":"6",
               "created_at":"2019-12-10 08:25:12",
               "updated_at":"2019-12-10 08:25:12"
            },
            { 
               "id":11,
               "survey_id":1,
               "survey_question_id":4,
               "user_id":3,
               "answer":"6",
               "created_at":"2019-12-10 08:25:59",
               "updated_at":"2019-12-10 08:25:59"
            },
            { 
               "id":17,
               "survey_id":1,
               "survey_question_id":4,
               "user_id":4,
               "answer":"6",
               "created_at":"2019-12-10 08:28:17",
               "updated_at":"2019-12-10 08:28:17"
            }
         ]
      },
   ]
}

Пока это код, но у меня проблемы

$survey = Survey::with( 'surveyQuestions.responseType','surveyQuestions.surveyQuestionOption', 'surveyQuestions.answer')
            ->where('id', $id)->first();

    $result = [];

    foreach ($survey['surveyQuestions'] as $question) {
        $options = [];

        if (!in_array($question->response_type_id, [2, 3, 4])) {
            continue;
        }

        foreach ($question['surveyQuestionOption'] as $option) {
            $count = 0;
            foreach ($survey['answer'] as $answer) {
                // output 1 :dd(json_encode($answer));
                if ($answer->survey_question_id === $option->survey_question_id) {
                    $count++;
                }
            }
        }

        $options[$option->id] = [
            'title' => $option->option,
            'vote_count' => $count
        ];
        // output 2: dd(json_encode($options));
    }

    $result[$question->id] = [
      'title' => $question->question,
      'options' => $options
    ];
    // output 3: dd(json_encode($result));
}

выходы

1:
"{"id":1,"survey_id":1,"survey_question_id":1,"user_id":2,"answer":"muy bien","created_at":"2019-12-10 08:25:12","updated_at":"2019-12-10 08:25:12"}"

2:
"{"4":{"title":"opcion d","vote_count":4}}"

3:
{"6":{"title":"jaksjakjf fjf a jaskj fkf ja range","options":{"4":{"title":"opcion d","vote_count":4}}}}"

Проблема в том, что только один тип вопроса имеет 'surveyQuestionOptions', который является множественным выбором,Также вывод неправильный, вывод 1 показывает неправильный ответ, он показывает первый ответ для типа вопроса: текст с response_type_id === 1. Я думал, что этот код пропущен по этому типу, если нет, я хотел бы исправить это всохраните текст ответов и двигайтесь дальше.

if (!in_array($question->response_type_id, [2, 3, 4])) {
    continue;
}

У меня также сложилось впечатление, что в выводе массива $options будут показаны все параметры, и он показывает только последний, в котором всего 4 параметра, то же самое с результатом, я думал, что он покажетМассив со всеми вопросами и массивом опций, который также принадлежит ему, и он показывает что-то полностью отключенное. этот вопрос, который он показывает, является вопросом ранжирования, и у него даже нет вариантов, ответ на вопрос ранга - это число от 1 до 6.

Я бы хотел сохранить вопросы примерно так:

TEXT
question 
//all answers 

YES OR NO
question
yes x amount of people 
no x amount of people

RANKING (depending on stars set by question, could be between 3 - 6)
question 
1 star x amount of people 
2 star x amount of people 
3 star x amount of people 

MULTIPLE CHOICE (could be one entry in the db or more depending on the amount of options that can be selected)
question
option 1 x amount of people  
option 2 x amount of people 
option 3 x amount of people 
option 4 x amount of people 

x количество людей - это просто подсчет того, сколько ответов соответствует (исключая текстовый вопрос) или принадлежит определенному варианту множественного выбора.

На вопрос должно быть не более 4 ответов, некоторые вопросы не являются обязательными, поэтому человеку не нужно на него отвечать, но по большей части должно быть 4 ответа.

Я неВы уверены, как получить код, который у меня работает, чтобы правильно классифицировать и сохранить эти вопросы и ответы?

РЕДАКТИРОВАТЬ: текущий код, где текстовый вопрос и множественный выбор работают, как ожидалось

foreach ($survey['surveyQuestions'] as $question) {
$options = [];

if ($question->response_type_id === 1) {
    foreach ($survey['answer'] as $answer) {
        if ($answer->survey_question_id === $question->id) {
            $options[$answer->id] = [
                'title' => $answer->answer,
                'vote_count' => null
            ];
        }
    }
}

if ($question->response_type_id === 2) {
    foreach ($question['surveyQuestionOption'] as $option) {
    $count = 0;
        foreach ($survey['answer'] as $answer) {
            if ($answer->survey_question_id === $option->survey_question_id
                && (int)$answer->answer === $option->id) {
                $count++;
            }

            $options[$option->id] = [
                'title' => $option->option,
                'vote_count' => $count
            ];
        }
    }
}

Однако теперь я пришел к выводу, что ранг и даили никакие вопросы не придется делать по-другому, потому что я не уверен, как сравнивать варианты, которые не существуют, потому что у этих вопросов нет вариантов, у ранга просто есть переменная в самом вопросе, называемая ранжированием сколичество звезд в вопросе, и да или нет, я тоже не знаю, как их сравнить.

Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...