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

Php Yii-使用afterDelete()更新另一个表中的数据,php,yii,Php,Yii,我正在使用Yii afterdelete()更新在另一个表中删除的相关数据。以下是我在控制器中的代码: 控制器动作 public function actionDelete($id) { if(Yii::app()->request->isPostRequest) { // we only allow deletion via POST request $this->loadModel($id)->delete();

我正在使用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');

   }

从一季到一季,这看起来很像是一个有很多关系的节目,所以你可能想在未来利用这些关系来获取相关记录。在yii指南中有一个很好的文档:

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

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

如果有某种限制,这可能会更好,但因为这是我的品味问题,我就不谈了。

从一个季节到另一个季节,这看起来非常像一个有很多关系的节目,所以你可能希望在将来使用关系来获取相关记录。在yii指南中有一个很好的文档:

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

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

如果有某种限制,这可能会更好,但因为这是我的品味问题,我就不谈了。

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

     }
嗯,但是如果您注意到
afterDelete
中调用
findByID($id)
的第二行,但是我们在
afterDelete
中,并且记录实际上已死亡(删除)

要解决此问题,您可以在删除模型之前使用
变量
&a
在删除之前抓取
id

    //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();
     }
现在,如果您将
afterDelete
中的
id
更改为
$this->cached\u seasure\u id
。。它应该会起作用


好吧,这个解决方案就是基于这个,我不太确定它是否会像现在这样工作!!所以,试一试&让我们知道会发生什么?

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

     }
嗯,但是如果您注意到
afterDelete
中调用
findByID($id)
的第二行,但是我们在
afterDelete
中,并且记录实际上已死亡(删除)

要解决此问题,您可以在删除模型之前使用
变量
&a
在删除之前抓取
id

    //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();
     }
现在,如果您将
afterDelete
中的
id
更改为
$this->cached\u seasure\u id
。。它应该会起作用


好吧,这个解决方案就是基于这个,我不太确定它是否会像现在这样工作!!那么,试一试&让我们知道会发生什么?

它有什么问题?你有错误吗?快速阅读会显示一些您可以更改的内容,但它看起来应该可以工作。不,我没有收到任何错误。首先,我明白我犯了一个错误,而且我不应该在控制器内。。。但仍然不起作用,我尝试使用var dump查看函数是否在删除后执行,但没有看到任何结果!有什么问题吗?你有错误吗?快速阅读会显示一些您可以更改的内容,但它看起来应该可以工作。不,我没有收到任何错误。首先,我明白我犯了一个错误,而且我不应该在控制器内。。。但仍然不起作用,我尝试使用var dump查看函数是否在删除后执行,但没有看到任何结果!我尝试了正确的updateALL(),但仍然不起作用。我已经定义了很多关系。但是我不知道如何使用它来更新我的表。例如,您可以在afterDelete中遍历$this->relationName。它可能是这样的:foreach($this->Shows as$show){$show->attribute=123;$show->save();}但是,如果您要更新很多节目,updateAll将是一个不错的选择,因为它使用的是查询而不是AR。我尝试了正确的updateAll(),但仍然不起作用。我已经定义了很多关系。但是我不知道如何使用它来更新我的表。例如,您可以在afterDelete中遍历$this->relationName。它可能是这样的:foreach($this->Shows as$show){$show->attribute=123;$show->save();}但是,如果您要更新大量的节目,updateAll将是一种方式,因为它使用查询而不是AR。目前正在处理遗留的Yii 1.1项目。当删除AR模型或
CActiveRecord
时,更准确地说,
delete()
不会清除实例的属性,因此无需缓存被删除实例的
id
,只需在
afterDelete()
中使用
$this->id
,或者可以直接迭代关系,例如,
foreach(此->显示为$show)
目前正在处理遗留的Yii 1.1项目。当删除AR模型或
CActiveRecord
时,更准确地说,
delete()
不会清除实例的属性,因此无需缓存被删除实例的
id
,只需在
afterDelete()
中使用
$this->id
,或者可以直接迭代关系,即
foreach(此->显示为$show)