0

このモデル コードを使用してレコードを削除しています。

public function actionDelete($id)
{
        $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'));
}

このレコードを含むテーブルは、削除制限制約のある他のテーブルと 1 対多の関係にあります。

したがって、子テーブルに関連するレコードを持つレコードを削除すると、次のような例外がスローされます

CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`bzuexamsystem`.`campus`, CONSTRAINT `fk_Campus_City` FOREIGN KEY (`CityID`) REFERENCES `city` (`CityID`) ON UPDATE CASCADE). The SQL statement executed was: DELETE FROM `city` WHERE `city`.`CityID`=1 

ユーザーフレンドリーなエラーメッセージを表示する方法はありますか。ありがとう

4

3 に答える 3

6

例外をキャッチする必要があります。何かのようなもの

try{
    $this->loadModel($id)->delete();
    if(!isset($_GET['ajax']))
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }catch (CDbException $e){
        if($e->getCode()===23000){
            //You can have nother error handling
            header("HTTP/1.0 400 Relation Restriction");
        }else{
            throw $e;
        }
    }

ビュー ファイルで CGrigView も使用する場合は、「ajaxUpdateError」関数を渡す必要があります。例:

$this->widget('zii.widgets.grid.CGridView',
  array(
    'id' => 'model-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'ajaxUpdateError' => <<<JS
      function(xhr, ts, et, err){
        if(xhr.statusText==="Relation Restriction"){
          $("#errorDiv").text("That model is used by something!");
        }
        else{
          alert(err);
        }
      }
    JS
    ,
    'columns' => 
        array(
            'model_id',
            'name'
        )
    )
);
于 2013-02-14T14:13:05.950 に答える
3

$ this-> loadModel()はCActiveRecordオブジェクトを返すと思います...

まず、削除するレコードが実際にロードされていることを確認する必要があります。次に、ステートメントの先頭で@を使用すると、エラーが許可されません。次に、CActiveRecord-> delete()がfalseを返す場合、レコードが削除されなかったことを意味します。

public function actionDelete($id) {
    $record = $this->loadModel($id);
    if ($record !== null) {
        if (@$record->delete()) {
            // code when successfully deleted
        } else {
            // code when delete fails
        }
    } else {
        // optional code to handle "record isn't found" case
    }
}
于 2012-10-15T16:41:28.057 に答える
2

set to null外部キーに制限がある行を削除したり、に変更したりno action、要件に応じて変更したりすることはできません

だからあなたの鍵はset to null削除cascadeupdate

于 2012-10-15T15:25:55.567 に答える