как показать данные из 3 комбинационных таблиц с помощью codeIgniter - PullRequest
0 голосов
/ 09 июля 2011

У меня есть три таблицы базы данных, question_set , вопрос и ответ .
question_set содержит set_name и set_id
вопрос содержит вопрос , а также question_set_id
ответ содержит ответ , question_id

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

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

Просто думал, что укажу.

Ваш дизайн базы данных ужасен.

Это не будет хорошо масштабироваться, и на самом деле я не думаю, что это будет на самом деле. работа.

Я бы так и сделал

Три стола

sets => идентификатор, имя
questions => id, set_id, вопрос
answers => id, set_id, question_id, ответ, баллы

Обратите внимание, что в моем приведенном выше примере я делаю это на один шаг вперед, а не каждому ответу, являющемуся истинным или ложным, у него может быть назначенное значение балла. следовательно, ответ, который вы посчитали полуправильным, можно получить 5 баллов, где в качестве правильного ответа можно дать 10 баллов, он также работает как логическое значение «истина», просто правильный ответ равен 1 баллу, а неправильный ответ - 0 баллов.

Во всяком случае.

Имея в виду приведенный выше дизайн таблицы.

Вы могли бы сделать

$this->db->select('s.id as set, s.name as name, q.id as qid, q.question as qu, a.id as aid, a.answer as an, a.points as p')
         ->from('sets s')
         ->join('questions q', 'q.set_id = s.id')
         ->join('answers a', 's.set_id = s.id')
         ->where('s.id', 'SET ID');

$questions = $this->db->get();
$set = array('questions' => array());

foreach($questions as $s){
  $set['id'] = $s->set;
  $set['name'] = $s->name;
  $set['questions'][$s->qid]['id'] = $q->qid;
  $set['questions'][$s->qid]['question'] = $q->qu;
  if(!isset($set['questions'][$s->qid]['answers']))
    $set['questions'][$s->qid]['answers'] = array();
  $set['questions'][$s->qid]['answers'][] = array(
    'id' => $q->aid,
    'answer' => $q->an',
    'points' => $q->p
  );
}

Итак, вы получите массив, который будет выглядеть примерно так:

array(
  'id' => 1,
  'name' => 'My first quiz',
  'questions' = array(
    array(
      'id' => 1,
      'question' => 'What is 1+1+1?',
      'answers' => array(
        array(
          'id' => 1,
          'answer' => 1,
          'points' => 0
        ),
        array(
          'id' => 2,
          'answer' => 2,
          'points' => 0
        ),
        array(
          'id' => 3,
          'answer' => 3,
          'points' => 1
        )
      )
    ),
    array(
      'id' => 2,
      'question' => 'What is 2+2+2?',
      'answers' => array(
        array(
          'id' => 4,
          'answer' => 6,
          'points' => 1
        ),
        array(
          'id' => 5,
          'answer' => 2,
          'points' => 0
        ),
        array(
          'id' => 6,
          'answer' => 3,
          'points' => 0
        )
      )
    )
  )
);

Тогда вы можете сделать.

echo '<h2>'.$set['name'].'</h2>';
foreach($set['questions'] as $q){
  echo '<div class="question">';
  echo '<h3>'.$q['question'].'</h3>';
  echo '<div class="answers">';
  foreach($q['answers'] as $a){
    echo '<label for="a'.$a['id'].'">'.$a['answer'].'<input type="checkbox value="'.$a['id'].'" name="q'.$q['id'].'" /></label><br />';
  }
  echo '</div>';
  echo '</div>';
}
0 голосов
/ 09 июля 2011

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

1) Соедините набор вопросов и таблицы вопросов 2) Для каждой записи в наборе результатов найдите ответы для этой записи и поместите их в отдельный массив, вложенный в больший массив, где ключ является идентификатором вопроса.

Ваш взгляд будет выглядеть примерно так:

foreach($questions as $question)
{
    //Print question information
    $answers = $answers_array[$question['id']];
    foreach($answers as $answer)
    {
        //Print answers information
    }
}

Возможно, это не лучшая практика, но это поможет.

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