0

我正在使用 Yii afterdelete() 来更新在另一个表中删除的相关数据。这是我在控制器中的代码:

控制器动作

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.');
}

模型功能

  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');

   }
4

2 回答 2

4

正如@Gregor 所说,充分利用活动记录关系将使工作变得更加容易。因此,在Show模型中,您将拥有以下内容:

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

季节模型中,您将拥有以下内容:

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

定义关系后,您将能够执行此操作:

     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();
         }

     }

嗯,但如果你注意到afterDeletewhich 调用中的第二行findByID($id)但我们在里面afterDelete,那么记录实际上已经死了(删除)!!

要解决此问题,您可以id在模型被删除之前使用 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();
     }

现在,如果您将idin更改afterDelete$this->cached_season_id.. 它应该可以工作。

好吧,这个解决方案是基于这个yii-fourm-topic,我不太确定它是否会按原样工作!!那么,试一试,让我们知道会发生什么?

于 2012-09-18T09:56:31.163 回答
1

这看起来很像从 Season 到 Show 的 HAS_MANY 关系,因此您可能希望在未来使用关系来获取相关记录。在 yii-guide 中有一个很好的文档:http ://www.yiiframework.com/doc/guide/1.1/en/database.arr

在我看来,您也有 jQuery 背景。您正在对数组(由 findAll 函数返回)调用 updateAll。正确的 updateAll 调用可能如下所示:

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

如果有某种限制,这可能会更好,但由于这是我个人喜好的问题,我就这样吧。

于 2012-09-17T14:05:59.170 回答