내가 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이 분리 된 속성의 속성을 무시하고 항상 저장된 값을 사용하도록 설정하는 방법이 있습니까?
이것 역시 우연히 발견되면 엔티티 관리자 병합은 엔티티 병합이 아니라 메타 데이터 병합이 아닌 병합 된 분리 엔티티를 의미합니다. 귀하의 비 직렬화 된 엔티티는 이전에 분리되지 않았기 때문에 합병 될 적절한 상태가 아닌 것으로 이해합니다. 새롭게 가져온 엔티티에 업데이트 된 데이터를 병합하여 부분 업데이트 (PATCH 메소드)를 구현할 수 있습니다. – jkavalik
가져온 엔티티에 데이터를 병합 할 때의 문제점은 지루하고 오류가 발생하기 쉬운 방법이라는 것입니다. 어쩌면 마녀 속성을 "합치려면"알기 위해 그 가치를 읽는 주석과 서비스를 개발해야합니다. – Nodens
글쎄, hydrator-> extract(), array_merge(), hydrator-> hydrate(), array_filter 및/또는 array_intersect_key를 사용하여 안전하게 유지할 수 있습니다. – jkavalik