Yii2规则compareAttribute与另一个模型

时间:2016-01-31 12:06:16

标签: validation yii2

在验证期间,我想与另一个模型的属性进行比较。可能吗?如果是的话,如果你能指出我正确的方向,我将不胜感激。我想象它以某种方式访问​​模型A中的模型B,但也许我的逻辑不好,我不知道如何实现这一点。感谢。

3 个答案:

答案 0 :(得分:3)

您可以尝试构建内联验证器see this doc for validatorfor inline validator

这是一个简短的样本

public function rules()
{
      return [
          .....
          ['my_field', 'validateMyCompare'],
          .... 
      ];
}

public function validateMyCompare($attribute, $params)
{
   if (YourModel::findOne(['your_model_field'=> $attribute]) {
        $this->addError($attribute, \Yii::t('view', 'The fields don't match.'));
   }
}

答案 1 :(得分:3)

我已经这样解决了:

public function getRelatedmodel() {
    return $this->hasOne(\app\models\Relatedmodel::className(), ['id' => 'relatedId']);
}

public function getMotherRelatedAttribute() {
    if ($mother = Model::findOne($this->mother)) {
        return $mother->relatedmodel->attribute;
    }
}

在规则中:

['attribute', 'compare', 'compareAttribute' => 'MotherRelatedAttribute', 'operator' => '<=', 'on' => self::SCENARIO_CREATE_RST],

答案 2 :(得分:0)

比较

[
// validates if the value of "password" attribute equals to that of "password_repeat"
['password', 'compare'],

// validates if age is greater than or equal to 30
['age', 'compare', 'compareValue' => 30, 'operator' => '>='],
]

此验证器将指定的输入值与另一个输入值进行比较,并确保它们的关系是否与运算符属性指定的关系。

compareAttribute:应与其值进行比较的属性的名称。当验证器用于验证属性时,此属性的默认值将是以_repeat为后缀的属性的名称。例如,如果要验证的属性是password,则此属性将默认为password_repeat。 compareValue:应与输入值进行比较的常量值。如果同时指定了此属性和compareAttribute,则此属性优先。 operator:比较运算符。默认为==,表示检查输入值是否等于compareAttribute或compareValue的输入值。支持以下运算符: ==:检查两个值是否相等。比较完成是非严格模式。 ===:检查两个值是否相等。比较完成是严格模式。 !=:检查两个值是否相等。比较完成是非严格模式。 !==:检查两个值是否相等。比较完成是严格模式。

  

:检查被验证的值是否大于与之比较的值。   =:检查被验证的值是否大于或等于与之比较的值。   &lt;:检查被验证的值是否小于与之比较的值。   &lt; =:检查被验证的值是否小于或等于与之比较的值。