我想从节点中的字段中删除段落;如果字段中有段落。下面的代码引发以下错误:
错误:在Drupal \ Core \ Entity \ ContentEntityBase-> hasTranslationChanges()中,调用成员函数getTranslation()为null
// delete all map_legend and map_item paragraphs before
if (!empty($d8_node->field_map_legends->getValue())) {
foreach ($d8_node->field_map_legends->getValue() as $paragraph) {
if ($paragraph["target_id"]) {
$previous_paragraph = Paragraph::load($paragraph["target_id"]);
if ($previous_paragraph) {
$previous_paragraph->delete();
}
}
}
}
当我注释掉$ previous_paragraph-> delete()时,它不会引发错误,但是不会删除段落。
我已经尝试过尝试/抓住删除。我试过了是否在$ previous_paragraph和field_map_legends本身上设置了isset。我已经尽力想了一切。
如果这与其他地方重复,我深表歉意。感谢您的帮助!
答案 0 :(得分:0)
这里的问题是删除一个段落不会删除对该段落的引用。在这种情况下,即使该ID的段落不再存在,该节点上的field_map_legends仍通过target_id引用已删除的段落。
最安全的方法是从节点中删除引用,而不是直接删除该段落(尽管如果需要,您可以将两者一起执行)。
// delete all map_legend and map_item paragraphs before
if ($d8_node->hasField('field_map_legends')) {
// Optional. Delete the Paragraph entities.
/*
foreach ($d8_node->field_map_legends->getValue() as $paragraph) {
if ($paragraph["target_id"]) {
$previous_paragraph = Paragraph::load($paragraph["target_id"]);
if ($previous_paragraph) {
$previous_paragraph->delete();
}
}
}
*/
// Remove all of the Paragraph references from this field.
$d8_node->set('field_map_legends', []);
// Save our changes to the node.
$d8_node->save();
}