2012-06-23 4 views
0

Zend_Db에는 대부분의 RDMS가하는 것처럼 삭제 및 업데이트를 계단식으로 처리하는 메소드가 있습니다. Zend_Db에서 지원 대신에 사용해야하는 forign 키를 지원하는 RDMS를 사용하는 경우 설명서에 명시되어 있습니다. 그 이유는 분명합니다. Zend_Db는 각 삭제/업데이트에 대해 별도의 db 쿼리를 실행하므로 성능과 (트랜잭션 동시성 설정에 따라) 원 자성을 잃을 수 있습니다. 다음 시나리오를 주어진 최선의 선택은 무엇RDMS에서 계단식 삭제 후 참조 된 파일을 정리하는 방법은 무엇입니까?

는 :

사용자는 여러 개의 앨범이 앨범은 여러 장의 사진이 포함되어 있습니다. 각 사진, 앨범 및 사용자는 equivilent db 테이블에 하나의 행이 있지만 각 사진은 CDN에도 저장됩니다. 사용자가 삭제되면 데이터베이스 캐스케이드는 앨범과 사진을 삭제합니다. 그러나 사진은 CDN에 남아 있으므로 제거해야합니다.

답변

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); 
    } 
} 
여기 내 솔루션입니다
관련 문제