2016-04-29 7 views
0

BloodRequestというモデルがあります。このモデルで新しいレコードが作成されると、そのレコードのステータスは「アクティブ」と定義されます。さて、Yii 1.1のコントローラを作成しようとしていますが、これは2か月より古い「required_on」に保存された日付をチェックします。 2か月以上経過している場合、ステータスは「非アクティブ」に更新されます。2つの日付を比較する方法とYiiのモデルデータを更新する方法

問題:コントローラを作成し、ステータスを更新します。しかし、2ヶ月以上経過したレコードを更新するのではなく、すべてのステータスを非アクティブに更新します。私はどこに問題があるのか​​見つけようとしていたが、できなかった。私が見るようにすべてが大丈夫です。コントローラのアクションのコードは以下のとおりである:考慮すべき

public function actionRequest() { 

//save all the record in an array 
    $model = BloodRequest::model()->findAll(); 


    foreach ($model as $key) { 
     $id = $key['id']; 
     $date = date("YYYY-MM-DD", strtotime($key['required_on'])); 

//check the date and update status 

     if (strtotime('-60 days') > strtotime($date)) { 
      $found = BloodRequest::model()->findByPk($id); 

      $found->status = "active"; 
      if($found->validate()) 
      { 
       $found->save(); 
      } 


     } 
    } 




    $this->render('request'); 
} 
} 
+0

がある場合、基本的には、日付が2か月以上経過するとステータスが「アクティブ」に変更されます。したがって、あなたのデータベース内のすべてのステータスが非アクティブであり、条件が決して満たされない場合、日付が2か月以上経過していない可能性があります。 –

答えて

1

まず最初は、コードが常にメモリの制限ので、実行できなかったということです。実際、BloodRequest::model()->findAll()に電話すると、メモリが多すぎる可能性があります(数千の行がある可能性があります...)。

だから私のような、あなたは(ActiveRecordのクラスのbeforeSaveとafterSaveをオーバーライド)の前または行を更新した後、特定のタスクを実行する必要がない場合は、あなたが直接SQLを使用してタスクを解決することができると思う:

$sql = 'UPDATE BloodRequest SET status = "inactive" WHERE DATEDIFF(CURRENT_DATE, required_on) > 60'; 
\Yii::$app->db->createCommand($sql)->execute(); 
あなたのコードに
+0

ありがとう...それは良い作品です。 –

関連する問題