我有一个模块,以编程方式将大量节点添加到我的Drupal 7站点。为了防止重复,我想检查系统中是否已存在新创建的节点的标题。永远不会出现两个节点具有相同名称的情况。我尝试过使用node_load()
,但这似乎不允许我根据标题加载节点。
我很难理解如何继续,所以我想知道这里有人可以帮助我。
总结:如何检查具有特定标题的节点是否已存在?
感谢。
答案 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));
的胆量
答案 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"));