【问题标题】:How to restrict user by entering data for specific month where records greater than secific month exists in Yii2如何通过输入特定月份的数据来限制用户,其中 Yii2 中存在大于特定月份的记录
【发布时间】:2020-03-24 02:15:10
【问题描述】:

我使用的是 Yii2 基础版。我有一个名为 groupsavingdetails 的表,它存储每个组的每月储蓄。

假设我有一个组的成立日期是 2017-08-08。现在,在为该组创建每月储蓄记录时,我将选择组输入年份为 2017 年,月份为八月,然后输入所有值,这些值将为我提供八月的期末余额并保存在数据库中。

现在,当用户想要输入 10 月而不是 9 月时,他可以这样做,因为系统会将 8 月的期末余额显示为期初余额,并且他会在 10 月执行与 8 月相同的操作。

现在在输入 10 月后,用户必须不能输入 9 月的记录。

我有该组 2017 年以及 8 月、9 月、10 月、11 月和 12 月的记录。

发生的情况是,当我输入年份为 2018 年,月份为一月时,会显示警报消息,但不应显示该消息。

这里的条件在保存记录时失败。

$group = Yii::$app->db->createCommand('SELECT *
    FROM groupsavingdetails
    where groupsavingdetails.GroupId=:id
    ORDER BY groupsavingdetails.GroupSavingDetailsId DESC LIMIT 1')
->bindValues([
    ':id' => $model->GroupId,
])->queryAll();


$year2=0;
$month3=0;
foreach($group as $groups) {
    $model->OpeningBalance=$groups['ClosingBalance'];
    $model->TotalValueofLoanGiven=$groups['TotalValueofLoanGiven'];
    $model->LoanRepaidUptilNow=$groups['LoanRepaidUptilNow'];
    $model->TotalValueOfLoanOutstanding=$groups['TotalValueOfLoanOutstanding'];
    $year2=$groups['Year'];
    $month3=$groups['Month'];
}

$identity = \Yii::$app->user->identity;
$eid = $identity->id;
$model->EmpId = $eid;

if($model->LoanGiven!=0) {
    $model->TotalValueofLoanGiven+=$model->LoanGiven;
}

if($model->LoanRecovery!=0) {
    $model->LoanRepaidUptilNow+=$model->LoanRecovery;
}

$model->TotalValueOfLoanOutstanding = $model->TotalValueofLoanGiven-$model->LoanRepaidUptilNow;

$previousMonth = $model->Month - 1;
if ($previousMonth == 0) {
    $previousMonth = 12;
    $year2--;
}

// Here the condition is getting failed.
if ($model->Year >= $year2 && $model->Month > $previousMonth) {
    $model->ClosingBalance=($model->OpeningBalance+$model->TotalSaving+$model->LoanRecovery+$model->LoanInterest+$model->Fine+$model->BankInterest+$model->BankLoan-$model->Expenses-$model->LoanGiven);
    $model->save(); 
} else {
    echo "<script language='javascript'>";
    echo "alert('Records greater than selected year and month exists.')";
    echo "</script>";

    return $this->render('create', [
        'model' => $model,
    ]);
}

我应该改变什么?

【问题讨论】:

    标签: php mysql yii2 yii2-basic-app


    【解决方案1】:

    我们来看看你的情况

    $model->Year >= $year2 && $model->Month > $previousMonth
    

    在您的情况下,有两个表达式用 (&amp;&amp;) 连接。这意味着两个表达式都必须为真才能使整个条件为真。

    让我们有$year2 = 2017$previousMonth = 10(10 月)。

    现在您将 $model->Year 设置为 2018 年,并且 $model->Month = 1(一月)。 condtion 中的第一个表达式是2018 &gt;= 2017。这部分是true。但第二个表达式是1 &gt; 10,即false。然后true &amp;&amp; false 将导致false

    您实际上需要做的是仅在年份相同时检查月份。所以你要找的条件是:

    $model->Year > $year2 || ($model->Year == $year2 && $model->Month > $previousMonth)
    

    这个条件会这样工作:

    Year = 2018
    Month = 1
    
    2018 > 2017 || (2018 == 2017 && 1 > 10)
    true || (false && false)
    true || false
    true
    
    Year = 2017
    Month = 11
    
    2017 > 2017 || (2017 == 2017 && 11 > 10)
    false || (true && true)
    false || true
    true
    
    Year = 2017
    Month = 9
    
    2017 > 2017 || (2017 == 2017 && 9 > 10)
    false || (true && false)
    false || false
    false
    

    【讨论】:

    • 它适用于年份为 2018 年且月份为 1 月的情况。在此之后,我输入了 2018 年和 3 月而不是 2 月的记录。它也有效。但在那之后,当我尝试输入 2018 年和 2 月时,记录仍然被保存。这里没有显示警报
    • 我明白了,我错过了你是如何设置 $previousMonth 的。为什么将其设置为$model-&gt;Month - 1 而不是使用最新记录月份的$month3?当 2019 年已有一些记录但 2018 年 10 月/11 月/12 月没有记录时,您是否尝试允许从 2018 年 10 月创建记录?
    • 首先我检查 $model->Year==$year2,然后在里面检查 $model->Month>$month3,然后将执行计算并保存在数据库中,否则会显示警报。类似地接下来如果 $model->Year>$year2,然后在其中 $month3=0 并检查 $model->Year>$month3,然后计算并保存,否则会显示警报。它正在工作谢谢你
    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多