0

Zend_Db 包含级联删除和更新的方法,就像大多数 RDMS 的方式一样。文档指出,如果您使用支持外键的 RDMS,您应该使用它来代替 Zend_Db 中的支持。原因很明显;Zend_Db 为每个删除/更新发出单独的数据库查询,因此您会失去性能和(取决于事务并发设置)原子性。

鉴于以下情况,最佳选择是什么:

一个用户有多个相册,一个相册包含多张照片。每张照片、相册和用户在等效的数据库表中都有一行,但是每张照片也存储在 CDN 上。如果用户被删除,数据库级联删除他们的相册和照片。但是,照片仍保留在 CDN 上,需要删除。

4

1 回答 1

0

也许可以用我自己模型的删除方法覆盖默认的级联删除方法,但听起来工作量很大,所以我为我的项目做了一个解决方法。

我有“zadania”表和“zadania_images”表。第二个表有“zadanie_id”列,它与这两个表相关。

“zadanie_images”行包含文件名,在级联删除父“zadanie_id”后,文件仍然存在。这是我的解决方案:

在“Zadanie”模型中:

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 回答