Как правильно программно удалить одну конкретную запись поля для поля с несколькими записями из одной конкретной сущности? (это конкретные поля и конкретные объекты, а не типы полей или экземпляры и типы объектов)
Вот некоторые возможности, которые я изучил, но которые не работают:
- Загрузка объекта с помощью
entity_load()
, установка записи поля равной = null или = array (), затем сохранение сfield_attach_update()
. Это самое близкое, что я нашел, но он оставляет запись нулевого поля зомби в базе данных, которая отображается в виде пустой строки в формах до тех пор, пока форма не будет сохранена иhook_field_is_empty()
может активироваться (hook_field_is_empty()
настроена так, что = null или = array () помечает как пусто). - Загрузка объекта
entity_load()
нажатием кнопки, сброс поля ввода по ключу, а затем сохранение нажатиемfield_attach_update()
. Похоже, что это ничего не делает - кажется, что Drupal интерпретирует запись, отсутствующую там, как знак, чтобы не изменять его. (странно, я иногда получаю максимальное время ожидания истечения времени запроса при попытке такого подхода) field_attach_delete()
- это слишком тупо: оно убивает все поля для сущностиfield_purge_data()
- лучше, но все еще слишком тупо: убивает все записи поля, а не конкретные записи
Итак, чтобы уточнить, у меня есть код, который находит (и загружает) объект, который имеет поле с несколькими записями, и находит конкретную запись в этом поле, которую необходимо удалить. Я хочу полностью удалить эту запись, не касаясь каких-либо других записей или каких-либо других полей объекта.
Мне нужно было сделать это как часть очистки миграции Drupal8.
После некоторых экспериментов я обнаружил, что повторение и последующее использование unset () в дельте может убить его. Мой пример - удаление тега (поэтому я ищу «target_id», а не «value», как это часто бывает для других полей).
А потом, если успех, то
$object->save();
источник
В Drupal 8, чтобы удалить поле из сущности:
Это вызовет магический метод __unset () из ContentEntityBase:
Не забывайте, что, чтобы сохранить ваши изменения, вам нужно позвонить
После того, как вы сделали все свои изменения.
источник
Это лучший способ:
источник
текущий предпочтительный метод будет использовать entity_metadata_wrapper
это лучший учебник по EMW, который я видел http://deeson-online.co.uk/labs/programatics-access-field-data-using-entitymetadatawrapper-drupal
источник