Программно получать узлы по названию в Drupal 7 - PullRequest
9 голосов
/ 03 декабря 2011

У меня есть модуль, который программно добавляет множество узлов на мой сайт Drupal 7. Чтобы предотвратить дублирование, я хочу проверить, не существует ли название моего недавно созданного узла в системе. Никогда не будет случая, когда два узла имеют одинаковое имя. Я пытался использовать node_load(), но это не позволяет мне загружать узлы на основе заголовка.

Я озадачен тем, как поступить, поэтому мне было интересно, может ли кто-нибудь здесь помочь мне.

Подведем итог: как проверить, существует ли уже узел с определенным названием?

Спасибо.

Ответы [ 6 ]

18 голосов
/ 04 декабря 2011

Узел - это сущности, поэтому вы можете использовать класс EntityFieldQuery для их запроса. Таким образом, вам не нужно беспокоиться о том, как информация хранится в базе данных. И если вам нужно будет добавить дополнительные фильтры на основе значений полей, эволюция кода будет легкой.

$result = (new EntityFieldQuery())
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('title', $title)
  ->execute();
$title_is_unique = empty($result['node']);
8 голосов
/ 04 декабря 2011

Вы можете получить все заголовки узлов с помощью 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"
 }

И если не будет возвращено никаких результатов, вы можете предположить, что у вас все получится.

ИлиВ качестве альтернативы вы можете отредактировать таблицу узлов, чтобы сделать поле заголовка УНИКАЛЬНЫМ и обработать ошибку, выданную MySQL.Правда, не знаю, насколько это возможно.

4 голосов
/ 16 мая 2013
node_load_multiple(array(), array('title' => $title));

Источник: кишки DrupalWebTestCase :: DrupalGetNodeByTitle

4 голосов
/ 11 марта 2013

Вот подход D7, использующий API и функцию подсчета.

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

return $query->countQuery()->execute()->fetchField();
2 голосов
/ 05 декабря 2011

Просто дружелюбный хедсэп.В целях безопасности вы должны ВСЕГДА использовать фигурные скобки вокруг таблиц в друпал sql запросах!Он предотвращает атаки с использованием 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"
 }
1 голос
/ 14 марта 2017

Правильный способ - добавить в базу данных уникальный индекс. Тогда вы будете уверены, что все названия уникальны. Это просто:

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