質問: 1つのエンティティの1つのフィールドから1つのエントリをプログラムで削除する 1つの特定のエンティティからマルチエントリフィールドの1つの特定のフィールドエントリをプログラムで削除する適切な方法は何ですか? (それは特定のフィールドと特定のエンティティであり、フィールドタイプまたはインスタンスとエンティティタイプではありません)私が調べたいくつかの可能性がありますが、うまくいきません: entity_load()でエンティティを読み込み、フィールドエントリを= nullまたは= array()に設定してから、field_attach_update()で保存します。それは私が見つけた最も近いものですが、フォームが保存されてhook_field_is_empty()が起動するまで、フォームに空白行として表示されるゾンビnullフィールドエントリがデータベースに残ります(hook_field_is_empty()は、= nullまたは= array()が空としてフラグを立てるように構成されています)。 entity_load()でエンティティを読み込み、キーでフィールドエントリの設定を解除してから、field_attach_update()で保存します。これは何もしないようです-drupalエントリが存在しないことを、それを変更しない兆候として解釈しているようです。(奇妙なことに、このアプローチを試みると、最大クエリ時間のタイムアウトが発生することがあります) field_attach_delete()-率直に言って、エンティティのすべてのフィールドが削除されます field_purge_data()-より良いですが、あまりにも率直です:特定のエントリではなく、フィールドのすべてのエントリを削除します 明確にするために、複数のエントリを持つフィールドを持つエンティティを検索(およびロード)し、そのフィールドで削除する必要のある特定のエントリを見つけるコードがあります。エンティティの他のエントリや他のフィールドに触れずに、そのエントリを完全に削除したいと思います。
回答: drupal 8の場合、エンティティからフィールドを削除するには:$entity = node::load($nid); unset($entity->field_name); これにより、contententitybaseからマジックメソッド__unset()が呼び出されます。public function __unset($name) { // unsetting a field means emptying it. if ($this->hasfield($name)) { $this->get($name)->setvalue([]); } // for non-field properties, unset the internal value. else { unset($this->values[$name]); } } 忘れないでください。変更を永続化するには、$entity->save(); すべての変更を行った後。