在yii2表单中保存关系 - 如何避免属性重复?

Ant*_*hin 10 php yii2

我有学生模型(id,name,school_id)和学校模型(id,name,...)关系模式是:学校有很多学生,学生只能有一所学校.

<?php
class School extends \yii\db\ActiveRecord
{
/*.....*/
public function getStudents()
{
    return $this->hasMany(Student::className(), ['school_id' => 'id']);
}
/*.....*/
}
?>
Run Code Online (Sandbox Code Playgroud)

现在我想在School创建表单上为每个学生呈现复选框:

<?= $form->field($model, 'students')->checkboxList(ArrayHelper::map($allStudents, 'id', 'name')) ?>
Run Code Online (Sandbox Code Playgroud)

($ model是School实例.为简单起见,我们假设没有很多学生 - 所以复选框控制就足够了)

现在,如果我想添加验证规则以允许最多5名学生(使用School :: rules()方法) - 在表单提交上我得到"尝试设置只读属性学生"

好的,这意味着AR关系是模型中的只读属性.

但是我如何使用规则使用Yii2 activeForm和验证,而不创建另外的伪造属性(student_ids),这些属性不会保存到db并且仅用于验证目的?

这里有"正确"的方式吗?谢谢!

Che*_*zen 1

如果我理解正确的话,你需要的就像你只想要学校模型中显示 5 个学生复选框。

在这种情况下,也许您不需要进行验证。

只需定义另一个关系,例如:

public function getStudentsForSchool()
{
    return $this->hasMany(Student::className(), ['school_id' => 'id'],'limit'=>5);
}
Run Code Online (Sandbox Code Playgroud)

这样每次使用此函数获取学生列表时,它只会获取前 5 条记录。