Yii - 使用afterDelete()更新另一个表中的数据

I am using Yii afterdelete() to update the related data which is deleted in another table. Here is my code in the controller:

Controller Action

public function actionDelete($id)
{
    if(Yii::app()->request->isPostRequest)
    {
        // we only allow deletion via POST request
        $this->loadModel($id)->delete();

        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
        if(!isset($_GET['ajax']))
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
    else
        throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}

Model function

  protected function afterDelete()
   {
        parent::afterDelete();
        $show_model = new Show();
        $show_model = Show::model()->findAll('tbl_season_id='.$this->id);
        $show_model->updateAll('tbl_season_id = NULL, on_season=0');

   }

As @Gregor said, a good use of active record relations would make the job much easier. So, in Show model you would have something like:

     public function relations()
     {
        return array(
            'season' => array(self::BELONGS_TO, 'Season', 'tbl_season_id'),
        );
     }

While in Season model you would have something like:

     public function relations()
     {
        return array(
            'shows' => array(self::HAS_MANY, 'Show', 'tbl_show_id'),
        );
     }

Having relations defined, will give you the ability to do this:

     public function afterDelete()
     {
         parent::afterDelete();
         $season_shows = Season::model()->findByID($id)->shows; //using the shows relation
         foreach($season_shows as $season_show) do
         {
            $season_show->setAttributes('tbl_season_id => NULL, on_season => 0');
            $season_show->save();
         }

     }

Hummm, but if you noticed that second line in the afterDelete which calls findByID($id) but we are inside the afterDelete and the record is actually dead (deleted)!!

To fix this you can grab the id just before the model is deleted using a variable & abeforeDelete

    //at the begining of your model class
    $private = $cached_season_id;
    ...
    //then somewhere at the end
    ... 
    public function beforeDelete()
     {
          $this->cached_tbl_season_id = $this->id;
          return parent::beforeDelete();
     }

Now if you change the id in the afterDelete to $this->cached_season_id .. it should work.

Well, this solution is based on this yii-fourm-topic and i am not quite sure if it's going to work as it is!! So, give it a try & let us know what happens?

That looks an awful lot like a HAS_MANY relationship from Season to Show, so you might want to use relations in the future to get related records. There is a pretty good documentation for that in the yii-guide: http://www.yiiframework.com/doc/guide/1.1/en/database.arr

It also seems to me, that you have a jQuery-background. You are calling updateAll on an array(which is returned by the findAll-function). A proper updateAll-call might look like this:

Show::model()->updateAll(array("tbl_season_id"=>null, "on_season"=>0), "tbl_season_id = $this->id")

This would probably be even better with some kind of constraint but since that is imo a matter of taste, I'll leave it at that.