Validation yii2验证不起作用

Validation yii2验证不起作用,validation,model,yii2,rule,yii2-validation,Validation,Model,Yii2,Rule,Yii2 Validation,我需要验证另一个表中的值,这两个表都是字段类型decimal 如果选择了数量模型1和可用模型2数据 模式1 统治 自定义验证函数 public function checkAvailable($attribute, $params) { $caid = $this->capex_budget_id; $available = Capexbudget::find() ->select(['available']) -&

我需要验证另一个表中的值,这两个表都是字段类型decimal

如果选择了数量模型1和可用模型2数据

模式1 统治

自定义验证函数

  public function checkAvailable($attribute, $params)
{
    $caid = $this->capex_budget_id;
    $available = Capexbudget::find()
            ->select(['available'])
            ->where('id = :caid', [':caid' => $caid])
            ->all();   // select amount from Capexbudget where id = $caid 
    if ($this->amount > $available){
     $this->addError('amount', 'not enough');
    }
}
我可以从Capexbudget获取我选择的ID的可用数据

以下是查询日志

但验证不起作用它不会比较$this->amount和$available之间的值
请看我遗漏的内容。

首先,您在此处选择的所有记录都与您的where条件相匹配:

    $available = Capexbudget::find()
        ->select(['available'])
        ->where('id = :caid', [':caid' => $caid])
        ->all();  // HERE
您应该将函数all更改为一,以获得一条记录。 第二件事是,如果使用all或one,则该方法返回的是object,而不是value

要使其工作,您应该将if语句更改为:

if ($this->amount > $available->available){   //here, compare to attribute `available`

哦,你的回答对我有用。非常感谢你。先生
if ($this->amount > $available->available){   //here, compare to attribute `available`