以编程方式在Drupal 7中按标题获取节点

时间:2011-12-03 18:01:12

标签: drupal drupal-7 drupal-modules

我有一个模块,以编程方式将大量节点添加到我的Drupal 7站点。为了防止重复,我想检查系统中是否已存在新创建的节点的标题。永远不会出现两个节点具有相同名称的情况。我尝试过使用node_load(),但这似乎不允许我根据标题加载节点。

我很难理解如何继续,所以我想知道这里有人可以帮助我。

总结:如何检查具有特定标题的节点是否已存在?

感谢。

6 个答案:

答案 0 :(得分:18)

节点是实体,因此您可以使用EntityFieldQuery类来查询它们。这样,您就不必费心将信息存储在数据库中。并且,您是否需要根据字段值添加其他过滤器,代码演变将很容易。

$result = (new EntityFieldQuery())
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('title', $title)
  ->execute();
$title_is_unique = empty($result['node']);

答案 1 :(得分:8)

您可以使用SQL查询获取所有节点标题,如:

 $row = db_query('SELECT nid FROM {node} WHERE title = :mytitle', array(':mytitle' => $myNewTitle))->fetchField();
 if(!isset($row['nid'])) {
    //safe to continue
 } else {
    //that title is already there and its in node with node id "nid"
 }

如果没有结果返回,那么你可能会觉得你很高兴。

或者您可以编辑节点表以使标题字段为UNIQUE并处理MySQL抛出的错误。不知道那是多么可行。

答案 2 :(得分:4)

这是使用API​​和计数功能的D7方法。

$query = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->condition('n.title', $myNewTitle, '=');

return $query->countQuery()->execute()->fetchField();

答案 3 :(得分:4)

node_load_multiple(array(), array('title' => $title));

来源:DrupalWebTestCase::DrupalGetNodeByTitle

的胆量

答案 4 :(得分:2)

只是一个友好的单挑局。为了安全起见,您应该始终在drupal sql querys中的表周围使用大括号!它可以防止SQL注入攻击。

所以它应该是:(注意{node})

 $row = db_query('SELECT nid FROM {node} WHERE title = :mytitle', array(':mytitle' =>   $myNewTitle))->fetchField();
 if(!isset($row['nid'])) {
    //safe to continue
 } else {
    //that title is already there and its in node with node id "nid"
 }

答案 5 :(得分:1)

正确的方法是向数据库添加UNIQUE索引。 然后你会确定所有的标题都是独一无二的。 很简单:

db_add_unique_key("{node}", "title_uniq", array("title"));