2010-03-25 1 views
3

MySQL 데이터베이스에서 Propel ORM을 사용하여 객체를 소프트 삭제하고 있습니다. 나는 연쇄 적으로 작업을 삭제했지만 실제 행이 삭제되지 않으므로 부모와 자식 간의 관계를 잃어 버리는 대가를 치러야합니다.Propel은 객체가 소프트 삭제 된 시점을 알고 있으므로 자식 엔티티가 삭제 된 부모를 계속 표시 할 수 있습니까?

Propel이 액세스 할 때 레코드가 소프트 삭제되었음을 알 수있는 방법이 없으므로 null 참조 예외가 throw되지 않습니까? 이 방법은 부모가 삭제 되었더라도 그 자식은 여전히 ​​이라고 읽을 수 있습니다.은 관계가 있지만 자식을 업데이트하거나 자식을 새로 작성하면 자식을 삭제할 때 삭제 된 부모는 액세스 할 수 없습니다. 예를 들어

,

책은 AuthorId을 가지고 있으며, AuthorId에 속하는 저자가 일시 삭제 된 다음 인 경우 :

$book->getAuthor(); 

는 (의 목적으로 만 볼 경우) 올바른 저자을 반환합니다. 그러나 새 책을 추가하면 소프트 삭제 된 작성자를 선택할 수 없습니다.

해당 기능이 Propel에 내장되어 있는지 알고있는 사람이 있습니까?

답변

0

작성자가 삭제 될 수는 있지만 그의 작품은 (또는 기본적으로 프로젝트의 시나리오로 나타나는 이유는 모르겠지만) 사용자 지정 기준을 만들고 실행하는 이유는 확실하지 않습니다. 다음 코드는 사용중인 Propel의 버전에 따라 다릅니다 (개념은 동일하게 유지됩니다).

$c = new Criteria(); 
$c->getNewCriterion(self::AUTHOR_ID, $parentId); 
return self::doSelect($c, $connection); 
0

그냥이 질문을 우연히 발견했습니다. 설명하는 기능에 소프트 삭제 기능을 사용하지 않는 것이 더 합리적이라고 생각됩니다. 작성자의 활성화 여부를 플래그로 지정하는 필드, 즉 isEnabled라는 부울 필드를 만드는 것이 좋습니다. 객체가 여전히 삭제 정말 적합하지 않은 응용 프로그램에 사용되는려고하는 경우에

당신은이 경우

AuthorQuery::create->filterByisEnabled() 
        ->find(); 

에, AuthorQuery 클래스에 생성 된 필터 방법을 사용할 수 있습니다. 소프트 삭제 기능은 참조 또는 되돌리기 실수에만 해당됩니다.

관련 문제