2

我将数据从外部源同步到我的 Drupal 安装。当我向新创建的节点添加分类术语关系时遇到问题。

我正在同步汽车,如果制造商名称(代码中的 $name)不在词汇表中,它将被添加到其中。如果它已经存在,则将 tid 附加到节点。

这与法拉利或大众汽车等术语完美搭配。但是还有梅赛德斯-奔驰。由于某种原因,EntityFieldQuery 似乎无法从词汇表中找到它,因为此代码在循环运行时会一遍又一遍地创建梅赛德斯-奔驰术语。

我想问题是单词之间的破折号。我希望看到 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;
}
4

1 回答 1

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;
}
于 2012-06-04T09:38:09.127 回答