Intereting Posts
OAuth – ошибка в Twitter (не удалось аутентифицировать) как я могу опубликовать значение текстового поля, которое динамически создается jquery Войдите в систему с помощью curl и перейдите на другую страницу 2006: сервер MySQL ушел php – Как перенаправить страницу с почтовыми данными Как отключить автозагрузку jQuery по запросу Ajax в Yii? Как реализовать один шаблон страницы в TYPO3 с настраиваемыми элементами для разделов? PHP Shorthand trernary operator??: «Ошибка анализа без ошибок»: sql Runtime reports PHP – Сокращение магических предложений Можно ли использовать new как имя метода в PHP 5.3? Ошибка «Ссылка на объект, не установленная на экземпляр объекта», ошибка подключения к SOAP-серверу из PHP последний выбранный вариант после обновления страницы Как добавить пользовательские правила валидации при использовании проверки формы запроса в Laravel 5 PHP Force Загрузить удаленный файл

Внедрение коллекции форм Symfony2 с добавлением и удалением разрешенных

В 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 на расстоянии анти-шаблона.

Почему это работает:

  • Массивы PHP не похожи на массивы на других языках. Они всегда словари, поэтому вы можете добавлять к ним строковые ключи, даже если у них есть только цифровые клавиши.
  • Поскольку коллекция Symfony отображается по имени поля, новые поля не будут соответствовать существующим данным, и удаленные поля не будут сопоставляться с существующими данными (и, таким образом, будут удалены из набора)

Один из способов передачи первичного идентификатора – использовать 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 свяжет значения запроса в соответствии с именами ввода.