0

我正在做一个网络应用程序,用户可以在其中选择他们的假期。因为他不需要一次选择所有的星期,所以我在 HolidayPeriod 模型的 save() 方法中(在事务中)融合了连续的假期。

我的问题是,HolidayPeriod 的 rules() 中的验证之一是新时期不与任何现有时期重叠。所以我的实际代码是:

public function save($runValidation = true, $attributes = null)
{
    $ts = Yii::app()->db->beginTransaction();
    try {
       $periods=$this->user->holidayPeriods;
       foreach ($periods as $period){
            if ($this->isConsecutiveWith($period)){
                $this->fusion($period);
            } 
       }
       if ($result = parent::save($runValidation, $attributes)) {

         ....................
         ....................


private function fusion($period){
    $this->start=date('Y-m-d',min(strtotime($this->start),strtotime($period->start)));
    $this->end=date('Y-m-d',max(strtotime($this->end),strtotime($period->end)));
    if (!$period->delete()){
        echo "FAIL<BR>";
        throw new Exception();
    }else {
        echo "OK<BR>";          
    }   
}

问题在于,当调用parent::save($runValidation, $attributes)时,验证检测到已删除的期间重叠并且失败。于是我做了一个简单的测试:

 $periods=$this->user->holidayPeriods;
 echo count($periods);
 foreach($periods as $period){
     $period->delete();
 }
 echo count($this->user->holidayPeriods);

并且两个调用echo在开始和结束时打印相同的数字。

如何在 delete() 之后更新 $this->user->holidayPeriods?

谢谢

4

2 回答 2

1

如何在 delete() 之后更新 $this->user->holidayPeriods?

(假设这是在 中定义的关系relations())您可以:

  • unset($this->user->holidayPeriods)- 下次访问$this->user->holidayPeriods时,将从数据库中加载。
  • $this->user->getRelated('holidayPeriods', true)- 强制holidayPeriods从数据库中刷新关系。
  • 完全避免从数据库刷新:
    
    $periods = $this->user->holidayPeriods;
    foreach ($periods as $ix => $period){
      if ($this->isConsecutiveWith($period)){
        $this->fusion($period);
        unset($periods[$ix]);
      }
    }
    $periods = array_values($periods); // fix period indexes
    unset($this->user->holidayPeriods);
    $this->user->addRelatedRecord('holidayPeriods', $periods, false);
    
于 2012-05-20T04:21:15.380 回答
1

您不会从“$this->user->holidayPeriods”中删除任何内容。通过这样做:$periods=$this->user->holidayPeriods;您只是将值传递$this->user->holidayPeriods给变量“$periods”。因此,当您修改 "$periods" 时,您并没有对$this->user->holidayPeriods. 所以尝试这样的事情:

 foreach($this->user->holidayPeriods as $period){
    if ($this->isConsecutiveWith($period)){
       $this->fusion($period);
     } 
 }
于 2012-05-20T03:00:44.480 回答