4

私はいくつかのコードのアドバイスを求めています。互いに依存している 2 つのモデルがあります。モデルの 1 つが削除されたときに、データベース内の両方のレコードが削除されていることを確認したいと考えています。

親が削除された場合、外部キーを使用してこれを一方向で処理します。しかし、これらの行は両方とも互いに依存しているため、子で同じ機能を実行する必要があります。

子モデルでは、delete メソッドをオーバーロードしたので、次のようになります。

    public function delete() {

    $cameraTransaction = $this->dbConnection->beginTransaction();

    try
    {
        $this->ftpuser->delete();
        if($this->beforeDelete())
        {
            $result=$this->deleteByPk($this->getPrimaryKey())>0;
            $this->afterDelete();
        }
        $cameraTransaction->commit();
    }
    catch(Exception $e) // an exception is raised if a query fails
    {
        $cameraTransaction->rollBack();
    }

}

私はテストしましたが、これはうまくいくようです。専門家/第一人者が私が正しいことをしたかどうかを確認できるかどうか疑問に思いました:)

ありがとう

アラン

4

1 に答える 1

2

私はあなたがそれを正しくやっていると思います。より一般的なものにすることができます。

すべてのモデルにはリレーションが定義されており、リレーションの一部 (またはすべて) を削除可能にします。現在のレコードと一緒に(何らかの形で)削除可能にフラグを立てる必要があります。

relations()モデル以外に新しい関数を定義します。

function deletableRelations() {
    return array('ftpuser', 'childs', .....);
}

いくつかの汎用関数を定義します (この関数にDB トランザクションを含めてください)。

function DeleteRelationships($model) {
    foreach( $model->deletableRelations() as $relation ) {
        if( $model->$relation == null) continue;

        if( is_array($model->$relation)) {
            foreach( $model->$relation as $relRecord ) {
                $relRecord->delete();
            }
        }
        else {
            $model->$relation->delete();
        }
    }
}

この汎用関数は、どのモデルでも使用できます。 ここで再帰が起こらないことを確認してください(つまり、親は子を削除しますが、子も親を削除しようとします。)

于 2012-10-10T06:38:19.440 に答える