我正在使用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');
}
答案 0 :(得分:3)
正如@Gregor所说,充分利用积极的记录关系会使工作变得更容易。 因此,在显示模型中,您将拥有类似的内容:
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
内并且记录实际上已经死了(已删除)!!
要解决此问题,您可以在使用id
&删除模型之前抓取variable
。一个beforeDelete
//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();
}
现在,如果您将id
中的afterDelete
更改为$this->cached_season_id
..它应该有效。
嗯,这个解决方案基于这个yii-fourm-topic,我不太确定它是否会起作用!!所以,试一试吧。让我们知道会发生什么?
答案 1 :(得分:1)
这看起来很像是从Season到Show的HAS_MANY关系,因此您可能希望将来使用关系来获取相关记录。在yii-guide中有一个非常好的文档:http://www.yiiframework.com/doc/guide/1.1/en/database.arr
在我看来,你有一个jQuery背景。您在数组上调用updateAll(由findAll函数返回)。 正确的updateAll-call可能如下所示:
Show::model()->updateAll(array("tbl_season_id"=>null, "on_season"=>0), "tbl_season_id = $this->id")
在某种限制条件下这可能会更好,但由于这只是一种品味问题,我会留下它。