В Symfony2, если я вставляю набор форм, указывающих на отношение многих к одному в Доктрине и позволяю добавлять и удалять, если я удалю запись с самого начала, добавьте ее в конец и отредактируйте некоторые из них в середине, как система знаете, какие записи обновлять, какие данные?
В учебнике нет ничего первичного ключа встроенных данных. При определенных обстоятельствах мои записи безошибочно удаляются и добавляются снова, а не редактируются (даже если нет изменений в конкретной записи). Это разбивает поля на записи, которые не включены в форму, и устанавливают их значения по умолчанию из модели БД.
Есть ли способ передать первичный ключ в форме и использовать ли он для выполнения обновлений, когда данные возвращаются?
Если вы хотите индексировать коллекцию (по идентификатору объекта) для всех запросов, вы можете просто использовать аннотацию indexBy
в своем классе сущности.
/** * @ORM\OneToMany(targetEntity="EntityClass", mappedBy="EntityVariable", indexBy="id") */ private $collection;
Основываясь на ответе и комментарии Akkumulator, а также на некоторых экспериментах, я сделал следующее:
Создайте новые поля (используя Javascript, как описано в документации ) с заменой __name__
не числом, а строкой: new_, за которым следует постоянно увеличивающееся число, которое не имеет никакого отношения к списку (например, new_1, new_2, new_3 …)
Мне не нужно вставлять первичные ключи в формы, и мне тоже не нужен indexBy – это хорошо, потому что indexBy чувствовал, что он слишком удален от формы, заканчивая тем, что Action на расстоянии анти-шаблона.
Почему это работает:
Один из способов передачи первичного идентификатора – использовать INDEX BY .
Например, скажем, у меня есть объект, называемый Клиент, и у Клиента есть несколько писем. В моем классе репозитория Customer я могу указать свою коллекцию для индексации по первому идентификатору электронной почты.
$qb->select('c, e') ->leftJoin('c.emails', 'e', null, null, 'e.id') ->where('c.id = :id');
Таким образом, сгенерированное имя входного тега будет
customer[emails][e.id][fieldName]
При отправке формы Symfony свяжет значения запроса в соответствии с именами ввода.