2014-09-03 1 views
0

응용 프로그램은 Symfony2 및 Doctrine2를 기반으로합니다.Doctrine2 - 관련 항목이 삭제되었는지 확인 (단방향 관계)

단방향 관계 OneToMany가 있는데 관련 엔티티 항목이 삭제되면 참조 열은 삭제 된 항목을 가리 키도록 설정되어 있으며 이는 단방향 연결이기 때문에 올바른 동작입니다. 하지만 이것은 나뭇 가지 템플릿에서 문제를 일으키고 있습니다. 왜냐하면로드하려고 시도하면 오류 엔티티가 발견되지 않기 때문입니다. 나는 나뭇 가지를 확인하려했으나 정의되어 있지만 차이는 없었다. 관련 항목이 삭제되지 않았는지 확인하는 가장 좋은 방법은 무엇입니까?

엔티티 예 :

class Programme 
{ 
    ... 
    /** 
    * @var string 
    * 
    * @ORM\ManyToOne(targetEntity="Form") 
    * @ORM\JoinColumn(name="form_id", referencedColumnName="id", nullable=true) 
*/ 
    private $form; 
    ... 
} 

나뭇 가지 검사 :

{% if programme.form is defined %} 
    //always getting here 
{% endif %} 

답변

0

확인과 같은 :

{% if programme.form %} 
    //always getting here 
{% endif %} 

'정의'에 대한 필요가 없습니다. 당신이 MySQL을위한 이노 엔진을 사용하는 경우

+0

나는 그것을 또한 시도했다. 그 문제는 연결된 레코드가 삭제 된 경우에도 해당 레코드에 대해 실제로 참조 된 ID를 사용할 수 있지만이를 확인하는 방법이라고 생각합니다. – trikess

+0

참조 ID가 있는지 확인하려면 조건 ID가 있으면 내부로 이동하십시오. {{programme.form.feldName}}을 인쇄하십시오. 부모 행 삭제 삭제시 null을 설정하려면 엔티티 관계에서 OnDelete = "SET NULL"을 사용하십시오. 상위 행을 삭제할 때 해당 하위 행이 더 이상 필요하지 않으면 onDelete = "CASCADE"를 입력하십시오. 그러면 더 이상 템플릿 파일을 체크인 할 필요가 없습니다.:) – herr

2

당신은 참조 된 개체가 필드가 null로 설정됩니다 삭제 그렇게 할 때 당신의 관계에

onDelete="SET NULL" 

를 추가 할 수 있습니다.

@ORM\JoinColumn(name="form_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 

이 방법은 누락 된 항목에 대한 링크가 전혀없고 더 이상 나뭇 가지 문제가 아닙니다.

삭제 소프트 사용하는 경우 :

그런 다음 기업은 어떻게 든 삭제 된 것을 신고된다고 가정 메신저 당신은 같은 것을 할 수있다 : 이것은 당신이에 deleted 열이 있다고 가정

{% if programme.form.deleted|default(true) != true %} 
    //Your form will always be defined but if 
    //its deleted then you want to ignore it 
{% endif %} 

을 형태. 또한 양식이없는 항목의 경우 기본값 인 true를 사용합니다. 당신이 당신이 양식 개체에 isNotDeleted() 같은 방법을 구현할 수 확인 단순화하려면

:

public function isNotDelete() 
{ 
    return $this->deleted === false; 
} 

은 다음 나뭇 가지 검사는 다음과 같습니다

{% if programme.form.notDeleted|default(false) %} 
    //do stuff 
{% endif %} 

당신은 여전히 ​​기본 필요 필터는 엔티티에 형식 연결이 없으면 예외를 찾을 수없는 예외가 발생하기 때문에 필터링 할 수 있습니다.

+0

안녕하세요, 이 항목은 완전히 삭제하지 않고 소프트 삭제 만 사용하고 있기 때문에 매우 좋아 보이지만 나에게 적합하지 않을 수 있습니다. 이전에 언급하지 않은 죄송합니다. – trikess

+0

그러면 "소프트 삭제"를 나타 내기 위해 사용중인 열을 확인할 수 있습니다. 기본 나뭇 가지 필터를 사용하면 폼이없는 엔터티에 대한 메서드를 찾을 수없는 예외가 발생하지 않게됩니다. – Chausser