Yii2:基于两个模型的日期自定义验证


Yii2: Custom Validation on Dates based on two models

>我有两个模型,即 Patient Admission具有两列,例如admission_datedischarge_date另一个模型daily_ward_entry有一个日期字段,说两个模型date相关ipd_patient_id

现在我想要的是创建一个或两个验证器,以便我可以限制admission_datedischarge_date之间的日期条目daily_ward_entry

我看了一下compare validator,但我无法弄清楚,如何将要比较的值替换为另一个具有关系的模型的属性。

我尝试了以下变体,但它总是抛出错误:

变体一

[$this->discharge_date, 'compare', 'compareValue' => $this->admission_date, 
'operator' => '>='],

错误 - Unknown Property – yii'base'UnknownPropertyException

变奏二

['discharge_date', 'compare', 'compareValue' => 'admission_date', 'operator' => '>='],

错误 - Discharge Date must be greater than or equal to "admission_date". 无论日期是低还是大,都会生成此错误

变化三

[strtotime($this->discharge_date), 'compare', 'compareValue' =>
strtotime($this->admission_date), 'operator' => '>='],

错误 - Unknown Property – yii'base'UnknownPropertyException

我需要一些指导和帮助。谢谢。

在这种情况下,您必须执行自定义验证。 在自定义函数中,您将在 POST 中获取所有模型数据,因此您可以获取数据并执行验证。

您应该能够使用自定义验证程序实现验证规则:

public function rules()
{
    return [
        ['daily_ward_entry', 'validateDate'],
    ]
}
public function validateDate($attribute, $params) {
    if(!($this->patientAdmission->admission_date <= $this->$attribute && $this->$attribute <= $this->patientAdmission->discharge_date)) {
        $this->addError($attribute, 'The Daily Ward Entry must be between the admission date and the discharge date.');
    }
}

可以想象这样的事情应该有效,我不完全确定你们的关系是如何建立的,所以你可能不得不稍微修改一下。