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

     }

afterDeleteうーん、でもあなたがその2行目を呼び出しているのに気づいたらfindByID($id)、私たちは中にいafterDeleteて、レコードは実際に死んでいる(削除されている)!!

これを修正するには、 &idを使用してモデルが削除される直前を取得できますvariablebeforeDelete

    //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に基づいており、それがそのまま機能するかどうかはよくわかりません!! それで、それを試してみて、何が起こるかを私たちに知らせてください?

于 2012-09-18T09:56:31.163 に答える
1

これは、シーズンからショーまでのHAS_MANY関係に非常によく似ているため、将来、関係を使用して関連レコードを取得することをお勧めします。yii-guideには、そのためのかなり良いドキュメントがあります:http ://www.yiiframework.com/doc/guide/1.1/en/database.arr

また、あなたはjQuery-backgroundを持っているように思えます。配列(findAll関数によって返される)でupdateAllを呼び出しています。適切なupdateAll-callは次のようになります。

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

これは、ある種の制約があればさらに良いでしょうが、それは好みの問題なので、そのままにしておきます。

于 2012-09-17T14:05:59.170 に答える