我将数据从外部源同步到Drupal安装。当我将分类术语关系添加到我新创建的节点时,我遇到了问题。
我正在同步汽车,如果制造商名称(代码中的$ name)不在词汇表中,它将被添加到它中。如果它已经存在,则tid附加到节点。
这与法拉利或大众汽车等术语完美配合。但后来有梅赛德斯 - 本茨。出于某种原因,EntityFieldQuery似乎没有从词汇表中找到它,因为这个代码在循环中运行时会一遍又一遍地创建Mercedes-Bentz术语。
我猜问题是文字之间的冲突。我想在EntityFieldQuery后面看到SQL子句,但是当我运行它时我没有完整的drupal设置,因此没有加载像Devel这样的模块。而且我不知道如何检查SQL。
我非常感谢有关如何调试或如何解决此问题的建议。感谢每一个环节。
这是我的代码:
$query = new EntityFieldQuery();
$result = $query
->entityCondition('entity_type', 'taxonomy_term')
->propertyCondition('name', $name) // $name = manufacturer, like "Ferrari"
->propertyCondition('vid', 2)
->execute();
if(!empty($result))
{
$tmp = array_pop($result['taxonomy_term']);
$node->field_brand[LANGUAGE_NONE][0]['tid'] = $tmp->tid;
}
else
{
$term = new stdClass();
$term->vid = 2;
$term->name = $name
taxonomy_term_save($term);
$node->field_brand[LANGUAGE_NONE][0]['tid'] = $term->tid;
}
答案 0 :(得分:0)
有一种方法可以对taxonomy_get_term_by_name()做同样的事情,但我想这不是首选的方式,所解释的解决方案应该是正确的。
我认为我们在这里看到了Drupal的错误。但对于其他人试图这样做,这是解决方案:
$test = taxonomy_get_term_by_name($name);
// It should be full of unique names, so no need to go through all of them
if(!empty($test))
{
$tmp = array_pop($test);
$node->field_brand[LANGUAGE_NONE][0]['tid'] = $tmp->tid;
}
else
{
$term = new stdClass();
$term->vid = 2;
$term->name = $name;
taxonomy_term_save($term);
$node->field_brand[LANGUAGE_NONE][0]['tid'] = $term->tid;
}