Сохраняющиеся сущности Doctrine с ассоциациями, которые были десериализованы с помощью JMSSerializer.

После успешной десериализации строки json в объект Doctrine с ассоциациями. При сохранении Doctrine всегда определяет эти ассоциации как «новые объекты». Как я могу обновить ассоциации только по идентификатору, а не изменять значения связанных сущностей, если есть какие-либо изменения?

Мое дело:

У меня есть несколько таблиц базы данных со статическими данными. Самый простой — для хранения юнитов. (У меня есть доктрина под названием Unit). Таблица такая:

|id|name |ratio    |
|1 |mgr  |1      |
|2 |gr   |1000   |
|3 |Kgr  |1000000|

Затем пользователь может создать элемент, который также имеет сущность доктрины на стороне сервера, называемую единицей. Я использую модель backbone.js на стороне клиента, и при обновлении она отправляется в мое приложение Symfony2 следующим образом:

//Item object to be serialized into Item entity
{
  id:   13141
  weight: 100
  unit: {
      id:1
      name:mgr
      ratio:1
  }
  //many more attributes here
}

Теперь я десериализую с помощью JMSSerializer, все в порядке, но я хочу, чтобы доктрина обновляла только идентификатор модуля отношения, а не весь модуль.

Когда я настаиваю, доктрина жалуется и сообщает мне, что он нашел «новую сущность Единицы» (чего я не хочу), и говорит мне установить каскад на persist в сущности доктрины. Но если я сделаю это, и кто-то изменит модуль json, разве это не изменит мою статическую таблицу модулей?

Например: Плохой пользователь изменяет Json, отправляя это:

//BAD item object to be serialized into Item entity
{
  id:   13141
  weight: 100
  unit: {
      id:1
      name:BadName //Will this get persisted to the database?
      ratio:1
  }
  //many more attributes here
}

Я, конечно, не хочу, чтобы это произошло. Я просто хочу добавить единицу с id: 1 к элементу.

Этот случай прост, и я мог бы просто получить единицу по идентификатору, а затем установить его в сущность, но в моем реальном приложении сущность Item намного больше, поэтому я хочу обрабатывать это автоматически.

Есть идеи?


person JMerino    schedule 23.07.2013    source источник


Ответы (1)


Позвольте мне сказать прямо:

Когда вы десериализуете текст, какой тип члена единицы? это class экземпляр всего array?

Если я правильно понял, и это экземпляр class, вы можете установить cascade в merge (не persist) в свойстве unit, чтобы вы могли сделать:

$em = ...; // your entity manager
$item = $em->merge($item); // merge will cascade to `unit` property as well

Надеюсь это поможет...

person Jovan Perovic    schedule 23.07.2013