因此,我正在进行一项测验,其中用户面临一系列问题,他通过表格回答这些问题。 一系列问题每个都包含一定数量的问题,当用户验证时,问题会一个接一个地被问到。
因此,我尝试使用每个问题的表单重新呈现视图,直到他们完成所有操作。这是我的行动:
public function actionAnswer($id_serie)
{
if ($id_serie != 0) //getting the serie's info
{
$serie = Serie::find()
->where(['id' => $id_serie])
->one();
$problems = (new \yii\db\Query()) //getting the problems in the serie
->select('*')
->from('problems')
->where(['id_serie' => $id_serie])
->all();
$prob_counter = $serie->nbr_of_problems; //counts the number of questions answered
$id_serie = 0;
}
$model = new Answer;
if ($model->load(Yii::$app->request->post()) && $model->validate())
{
$model->save(); // works just fine every time
if (--$prob_counter <= 0)
{
return $this->redirect('index.php?r=student/entry');
}
}
return $this->render('answer',
['model' => $model,
'problems' => $problems,
'serie' => $serie,
'prob_counter' => $prob_counter, //these last two are for debug
'id_serie' => $id_serie]);
}
第一次执行此操作时,$ id_serie永远不会为null或= 0。因此,我使用它只查询数据库一次,并设置一个计数器与系列中的问题总数。 (id est用户提交表单的时间) 如果他的答案是有效的,我会递减我的计数器,如果它低于0,则不再有问题可以回答,用户会被重定向。
然而,这个计数器永远不会降到0:它设置正确,只减少一次,然后它永远不会降低,无论我把线放在哪里。 (任何循环内部或外部) 另一方面,表单中的数据每次都正确地插入到数据库中。
我出错了什么?
答案 0 :(得分:0)
根据您的代码,$prob_counter
只存储每个系列的问题数量。您需要更改此项以显示该系列的未答复问题的数量。如何实现这将取决于您的模型和数据库,但它应该是这样的:
$problems = (new \yii\db\Query()) //getting the problems in the serie
->select('*')
->from('problems')
->where(['id_serie' => $id_serie])
->andWhere('not exists (select id from answer where problemid = problems.id')
->all();
此外,您应该查看working with relational data并避免在上一节中使用Query()
。