Я реализую REST API с помощью FOSRestBundle и столкнулся с проблемой модификации существующего объекта (PUT).
У меня есть класс Student с отношением ManyToOne
/**
* @JMS\MaxDepth(2)
* @ORM\ManyToOne(targetEntity="ClassRoom", inversedBy="students")
* @ORM\JoinColumn(name="classroom_id", referencedColumnName="id")
*/
protected $classRoom;
При выполнении действия PUT я получаю только атрибуты значения, так как я не хочу, чтобы пользователь мог изменять отношения с помощью запроса на размещение. Это пример полученных данных.
{
"id": 3,
"name": "pelayo",
"second_name": "ramon",
"last_name": "fernandez",
"birthday": "1983-08-15T00:00:00+0200"
}
Данные десериализуются с помощью сериализатора JMS, который устанавливает для атрибута $classRoom значение null, поскольку он не нашел его в полученных данных.
При выполнении слияния
$student2 = $this->get('doctrine')->getManager()->merge($student);
Если student2 сохраняется, текущая связь с classRoom стирается из базы данных, поскольку слияние устанавливает связь с нулевой.
Этого поведения можно избежать, получив текущую classRoom и установив ее в десериализованный объект вручную перед слиянием, но это уродливо.
Есть ли способ указать доктрине игнорировать атрибут при слиянии с отсоединенным и заставить его всегда использовать сохраненное значение?