0

Zend_Db には、ほとんどの RDMS と同じように、削除と更新をカスケードするメソッドが含まれています。ドキュメントには、外部キーをサポートする RDMS を使用している場合は、Zend_Db のサポートの代わりにそれを使用する必要があると記載されています。その理由は明らかです。Zend_Db は、削除/更新ごとに個別の db クエリを発行するため、パフォーマンスと (トランザクションの同時実行の設定によっては) 原子性の両方が失われます。

次のシナリオを考えると、最適なオプションは何ですか。

ユーザーには複数のアルバムがあり、アルバムには複数の写真が含まれています。各写真、アルバム、およびユーザーには、同等のデータベース テーブルに 1 つの行がありますが、各写真は CDN にも保存されます。ユーザーが削除されると、データベース カスケードによってアルバムと写真が削除されます。ただし、写真は CDN に残っているため、削除する必要があります。

4

1 に答える 1

0

デフォルトのカスケード削除メソッドを自分のモデルの削除メソッドで上書きすることは可能かもしれませんが、多くの作業のように聞こえるので、プロジェクトの回避策を作成しました。

「zadania」テーブルと「zadania_images」テーブルがあります。2 番目のテーブルには、2 つのテーブルを関連付ける「zadnie_id」列があります。

「zadanie_images」行にはファイル名が含まれており、親の「zadanie_id」をカスケード削除した後もファイルは残っていました。ここに私の解決策があります:

「ザダニエ」モデルでは:

public function deleteZadanie($id) {

    $row = $this->find($id)->current();
    if($row) {
        $image = new Model_ZadanieImage();
        $image->deleteRelatedFiles($id);
        $row->delete();
    }
}

「ZadanieImage」モデルでは:

public function deleteImage($id) {

    $row = $this->find($id)->current();

    if($row) {
        //delete the record
        $filename = $row['name'];
        $row->delete();
        //and delete related files

        unlink('images/zadanie/' . $filename);
        unlink('images/zadanie/thumbs/' . $filename);
    } 
}


public function deleteRelatedFiles($zadanie_id) {

    $select = $this->select()->where('zadanie=?', $zadanie_id);
    $images = $this->fetchAll($select);
    foreach($images as $image) {
        $this->deleteImage($image->id);
    }
}
于 2012-08-24T01:14:59.673 に答える