Zend_Db包含级联删除和更新的方法,就像大多数RDMS的方式一样。该文档指出,如果您使用支持forign键的RDMS,则应使用该RDMS代替Zend_Db中的支持。原因很明显; Zend_Db为每个删除/更新发出单独的数据库查询,因此您将失去性能和(取决于事务并发设置)原子性。
鉴于以下情况,最佳选择是什么:
用户有多个相册,一个相册包含多张照片。每张照片,相册和用户在等效数据库表中都有一行,但每张照片也存储在CDN上。如果删除了用户,则数据库级联会删除其相册和照片。但是照片仍留在CDN上,需要删除。
答案 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);
}
}