验证Yii2中的多个条件


Validate multiple conditions in Yii2

我在Leave Employee上有这样的验证:

  1. 验证startdate小于applydate (done)。
  2. 如果maximumquota小于0(完成),则不能申请休假。
  3. 如果status = approved, maximumquota - daysleave (done).

我想在startdate输入存在并被批准时添加另一个应用验证。startdate = startdate + daysleave, on form status=rejected .

我已经做了一个这样的算法:

if(startdate='startdate' between startdate(Y-m-(d+'daysleave')->where('status'=='approved')
{
    $_post = 'status'=rejected,
        'applydate=date('Y-m-d'),
        'startdate';
    )
} else {
}

这是我的创建控制器:

if ($model->load(Yii::$app->request->post())){
    if($model->daysleaveleft(Yii::$app->user->id,date('Y',strtotime($model->startdate)))>0)
    {
        //Edited
        if($model->startdate < max($s))
        {
            $model->status='2';
        }//
        if($model->startdate < $model->applydate)
        {
            echo "Error !";
        }
        else
        {
            $model->save();
            return $this->redirect(['view', 'id' => $model->id]);
        }
    }
    else
    {
        $model->status='2';
    }
} 
else
{
    return $this->render('create', ['model' => $model,]);
}

和我的Leave模型:

public function DaysLeaveLeft($id, $year) {
    $models = Leave::find()->select(['daysleave'=>'sum(daysleave)'])->where(['status'=>'approved','EmpId' => $id,'year(startdate)'=>$year])->One();
    $Setting = Setting::find()->where(['Var'=>'MaxLeave'])->One();
    return $Setting->Val - $models['daysleave'];  
}

我使用的操作步骤:

  1. 查询休假天数,如startdate = 03-08-2016,则enddate = startdate + Leave Days

    ALTER FUNCTION enddays(@Id bigint)
    RETURNS VARCHAR(10)
    AS BEGIN
    DECLARE @st DATE, @long INT,@Var VARCHAR(10)='0',@cekId INT =0
    SELECT @cekId=id,@st=startdate,@long=leavedays FROM leave WHERE id=@Id  
    IF @cekId > 0 BEGIN
    SELECT @long +=COUNT(dt)
    FROM calendar WHERE cast(dt as date) BETWEEN cast(@st as dt) and  cast(DATEADD(day,@long,@st) as date)
    set @Var = CAST(CAST(DATEADD(DAY,@long,@st) AS DATE) AS VARCHAR(10))
    END
    RETURN @Var
    END
    
  2. 然后做一个程序:

    ALTER procedure endleave
    @id bigint
    as
    BEGIN
    SELECT dbo.endays(l.id) from leave l
    WHERE GETDATE() < CAST(dbo.enddays(l.id) as date) 
    and EmpId=@id
    and status= 1
    END
    
  3. 将此添加到leavecontroller:

    $id=Yii::$app->user->id;
    $query="exec endleave @id=$id";
    $command=Yii::$app->db->createCommand($query);
    $s = $command->queryAll();
    
  4. 编辑控制器

    if ($model->load(Yii::$app->request->post())) {
        if($model->daysleaveleft(Yii::$app->user->id,date('Y',strtotime($model->startdate)))>0) {
            //Edited
            if($model->startdate < max($s)) {
                $model->status = '2';
            }
            if($model->startdate < $model->applydate) {
                echo "Error !";
            } else {
                $model->save();
                return $this->redirect(['view', 'id' => $model->id]);
            }
        } else {
            $model->status = '2';
        }
    }  else {
        return $this->render('create', ['model' => $model,]);
    }