2013-10-23 3 views
7

나는 Symfony2 프로젝트를 구축 중이며 gedmo/doctrine-extensions (GitHub)을 사용하여 소프트 삭제를 구현하고 있습니다. 내 질문은 softdelete를 "사용 안 함"또는 "덮어 쓰는"방법이 있는지, 아니면 무언가가 소프트 삭제 된 경우 검색합니다.Symfony2/Doctrine : Gedmo의 교리 확장을 사용할 때 "삭제 된"데이터 읽기.

나는 "사용자"개체를 참조하는 "주"개체가 있습니다

여기 상황이다. 특정 노트는 소프트 삭제 된 사용자를 참조합니다. 사용자가 삭제 되었더라도 TWIG의 "정의 됨"논리에 대해 true를 반환하고 삭제 된 사용자의 ID를 반환 할 수도 있습니다. 그러나 삭제 된 것인지 여부를 표시하는 "deletedAt"매개 변수를 포함하여 다른 정보를 쿼리하면 500 개의 "엔터티를 찾을 수 없습니다."오류가 발생합니다.

데이터가 실제로 남아 있고 메모 자체가 삭제되지 않았기 때문에 사용자가 삭제 되었더라도 여전히 메모를 작성한 사람이 누구인지 말하고 싶습니다.

그럴 수 있습니까? 그렇지 않은 경우 어떻게 소프트 삭제 된 항목이 있는지 제대로 감지합니까? 앞서 말한 것처럼 $note->getUser()은 여전히 ​​객체를 검색하고 null/"정의 됨"비교에 대해 true를 반환합니다.

+0

이것은 Doctrine2의 알려진 제한 사항입니다, https://github.com/doctrine/doctrine2/issues/4543를 참조 – PowerKiKi

답변

6

이 다른 단지 id와 아무것도 객체의 게으른 로딩을 방지 할 수 있습니다.

당신은 열망로드에 대한 자세한 정보를 찾을 수 있습니다 그리고 여기 주석의 :

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-eager-loading

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html합니다. 내 코드에 관해서는

이는 이제 User에 대한 링크를 정의 할 때와 같은 모습입니다 :이 경우

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="answers", fetch="EAGER") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

User 엔티티 answers 복수를 할 수 있습니다. answer 관점에서 User를로드 할 때이 작동합니다 :

foreach($answers as $answer) { 
    $user = $answer->getUser(); 

    if (!$user) { 
     continue; 
    } 
} 
+0

'eager loading' 문서 링크가 작동하지 않습니다 –

+0

고마워, 고쳐 줘 :) – Oli

1

삭제 된 항목이 결과에 반환되도록 일시적으로 소프트 삭제를 비활성화 할 수 있습니다. 당신을 위해 특별히 흥미로운 See the documentation는 읽기의 절입니다 :

이는 SoftDeleteable 필터를 사용할 수 없게되어 "소프트 삭제"결과에 표시됩니다 $ 보하기> getFilters()이었다 개체 -> 비활성화 ('소프트 삭제 가능');

위의 코드를 먼저 엔티티 관리자 $em에서 실행 한 다음이를 사용하여 $note을 수집하십시오.

+0

문제는 그 I 돈 소프트 삭제 된 상위 엔티티 (예 : 메모)를 원하지 않습니다. 필터를 비활성화하면 내가 원하지 않는 삭제 된 메모도 반환됩니다. –

14

당신은이 작업을 수행 할 수 있습니다 :

당신은 eager에 관계 로딩을 설정해야
$filter = $em->getFilters()->enable('soft-deleteable'); 
$filter->disableForEntity('Entity\User'); 
$filter->enableForEntity('Entity\Note'); 
+3

** 'softdeleteable'대신 ** 'softdeleteable'** 될 수 있습니다 ... (stof 교리 확장을 사용하고 있습니다) – eDoV