在验证期间,我想与另一个模型的属性进行比较。可能吗?如果是的话,如果你能指出我正确的方向,我将不胜感激。我想象它以某种方式访问模型A中的模型B,但也许我的逻辑不好,我不知道如何实现这一点。感谢。
答案 0 :(得分:3)
您可以尝试构建内联验证器see this doc for validator和for 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; =:检查被验证的值是否小于或等于与之比较的值。