如何在RDMS中级联删除后清理引用的文件?

时间:2012-06-23 13:19:14

标签: zend-db

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

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

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

1 个答案:

答案 0 :(得分: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);
    }
}
相关问题