2014-03-13 1 views
0

내가 FOSRestBundle와 REST API를 구현하고있어에서 관계를 무시하고 내가 엔티티를 기존의 수정에 문제가 발생했습니다 I 클래스 학생이Doctrine2 ORM 병합

을 (PUT)

/** 
* @JMS\MaxDepth(2) 
* @ORM\ManyToOne(targetEntity="ClassRoom", inversedBy="students") 
* @ORM\JoinColumn(name="classroom_id", referencedColumnName="id") 
*/ 
protected $classRoom; 

PUT 작업을 수행 할 때 사용자가 put 요청을 통해 관계를 수정할 수 없기 때문에 값 속성 만받습니다. 받은 데이터 예제입니다. 데이터 JMS 시리얼 느릅 나무와 직렬화 복원됩니다

{ 
"id": 3, 
"name": "pelayo", 
"second_name": "ramon", 
"last_name": "fernandez", 
"birthday": "1983-08-15T00:00:00+0200" 
} 

는 수신 된 데이터를 찾을 수 없습니다 때문에 $ 교실 null로 속성을 설정합니다.

student2 병합 null로 관계를 설정하기 때문에 교실와 현재의 관계가 데이터베이스에서 삭제됩니다 지속됩니다 경우 병합을

$student2 = $this->get('doctrine')->getManager()->merge($student); 

을 수행.

이 동작은 현재 클래스 룸을 검색하여 병합 전에 손으로 비 직렬화 엔티티로 설정하면 피할 수 있지만 이는 추합니다.

Doctrine이 분리 된 속성의 속성을 무시하고 항상 저장된 값을 사용하도록 설정하는 방법이 있습니까?

+0

이것 역시 우연히 발견되면 엔티티 관리자 병합은 엔티티 병합이 아니라 메타 데이터 병합이 아닌 병합 된 분리 엔티티를 의미합니다. 귀하의 비 직렬화 된 엔티티는 이전에 분리되지 않았기 때문에 합병 될 적절한 상태가 아닌 것으로 이해합니다. 새롭게 가져온 엔티티에 업데이트 된 데이터를 병합하여 부분 업데이트 (PATCH 메소드)를 구현할 수 있습니다. – jkavalik

+0

가져온 엔티티에 데이터를 병합 할 때의 문제점은 지루하고 오류가 발생하기 쉬운 방법이라는 것입니다. 어쩌면 마녀 속성을 "합치려면"알기 위해 그 가치를 읽는 주석과 서비스를 개발해야합니다. – Nodens

+0

글쎄, hydrator-> extract(), array_merge(), hydrator-> hydrate(), array_filter 및/또는 array_intersect_key를 사용하여 안전하게 유지할 수 있습니다. – jkavalik

답변

0

병합이 유일한 해결책은 아닙니다.

JMSSerializerBundle에는 Doctrine 엔티티의 객체 생성자가 포함되어 있습니다. 이 생성자를 활성화하면 비 직렬화 엔터티는 유지 될 수있는 관리 엔터티 ($em->persist($student))입니다. 비 직렬화 엔티티에서 수정 된 속성은 요청에서 JSON에 언급 된 속성뿐입니다.

Here 어떻게 활성화 할 수 있습니다.