0

我很新,Yii framework到目前为止我很喜欢使用它。我自己在我的第一个项目中,我有点陷入以下问题。

我有两个模型StudentTeacher. 它们与外键无关,但学生表有一个teacher_id属于该Teacher表的字段。(目前还不是很清楚如何将它们联系起来,但这是我以后要担心的另一个故事)。

在使用表单更新视图中的学生时,我也合并了教师的表单(全名、年龄等),但作为学生表单的一部分,它不会受益于学生模型中设置的验证规则。当我保存教师信息时(在相同的 POST 请求期间,在保存学生字段之前),验证似乎有效,因为如果缺少必填字段,它不会保存它,但它不会返回到学生表单,验证错误就像它自己的必填字段一样。我希望这不会太混乱,但我不知道如何更好地解释它。

任何想法都非常受欢迎!

4

3 回答 3

1

不确定我是否正确理解了您的问题,但是如果您想以相同的形式验证和保存两个模型,您可以这样做。

控制器:

$teacherModel = new Teacher;
$studentModel = new Student;

if(isset($_POST['Teacher']) && isset($_POST['Student']))
{
    $teacherModel->attributes = $_POST['Teacher'];
    $studentModel->attributes = $_POST['Student'];

    // check both models for validation errors before saving and redirecting.
    $teacherValid = $teacherModel->validate();
    $studentValid = $studentModel->validate();

    if($teacherValid && $studentValid)
    {
        $teacherModel->save(false);  // false = don't perform validation before saving
        $studentModel->save(false);

        $this->redirect(array('view','id'=>$studentModel->id));
    }
}

$this->render('create',array(
        'teacherModel'=>$teacherModel,
        'studentModel'=>$studentModel,
    ));

这将确保两个模型在重定向之前都是有效的,否则它将返回到表单。

然后,您可以在视图中显示来自两个模型的验证错误,方法是将它们以数组的形式传递给方法 $form->errorSummary:

<?php echo $form->errorSummary(array($teacherModel, $studentModel)); ?>
于 2013-07-27T10:22:00.253 回答
1

您可以在模型文件中以这种格式声明关系,不需要外键来声明关系,但如果有一个外键,您的查询将执行得更快......

'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)

您的案例的示例可能类似于..

public function relations() {   
    return array(
        'student' => array(self::BELONGS_TO, 'teacher', 'teacher_id'),
    );
}

关于您在同一形式中使用多个模型的查询,从您的描述中不清楚到底发生了什么,据我了解,您正在以同一形式使用多个 table_models,虽然这可能很复杂。

我建议您创建一个单独的表单模型,以使用单个表单处理多个表条目

于 2013-07-27T06:05:57.240 回答
0

所以我尝试了这个(Christian 建议的),虽然验证似乎有效,但 errorSummary 方法并没有起到作用。如果我错过了教师表单上的必填字段,它不会保存它,但不会返回错误摘要。我注意到有趣的是,如果我错过了学生表单中的必填字段,它会给我漂亮的红色错误字段,但是当我在这些字段中输入内容并且我在教师表单中省略了一个必填字段后,这一次是错误给老师的总结,确实显示。这有点令人困惑。最后我选择了另一条路。我首先检查 Teacher 表单,如果未通过验证,我会遍历 Teacher->model()->errors ,创建一个无序列表,并将其作为 Flash 消息发送给查看器。到目前为止,它工作正常。也许在未来,当我变得更有知识时,

于 2013-07-28T14:20:13.677 回答