我有三个数据库表, question_set ,问题和回答。
question_set 包含 set_name 和 set_id
问题包含问题以及 question_set_id
回答包含回答, question_id
我无法找到在一个视图文件中显示所有数据的方法,
我尝试了连接,但随后问题数据重复打印,因为每个问题都有三个或四个答案。
答案 0 :(得分:0)
最简单的方法,但当然需要更多的SQL调用,就是使用嵌套循环。
1)加入问题集和问题表 2)对于结果集中的每个条目,检索该条目的答案并将其放在一个单独的数组中,嵌套在一个更大的数组中,其中键是问题的id。
您的观点将如下所示:
foreach($questions as $question)
{
//Print question information
$answers = $answers_array[$question['id']];
foreach($answers as $answer)
{
//Print answers information
}
}
可能不是最佳做法,但它会起作用。
答案 1 :(得分:0)
我想我会指出。
您的数据库设计非常糟糕。
它不会很好地扩展,事实上我认为它实际上不会。工作
我这样做的方式是
三张桌子
sets
=> id,名称
questions
=> id,set_id,问题
answers
=> id,set_id,question_id,answer,points
请注意,在上面的示例中,我更进一步,而不是每个答案都是真或假,它可以有一个指定的点值。 因此,你认为半正确的答案可以给出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>';
}