Как получить все типы контента, у которых нет узлов?


В Drupal 7 если вам нужен список типов контента, у которых нет узлов, вы можете сделать это с помощью следующего запроса:

SELECT type, name, COUNT(nid) as total
              FROM node_type LEFT JOIN node USING(type)
              GROUP BY type
              HAVING total = 0
              ORDER BY name

Но в Drupal 8 у нас нет таблицы {node_type}, и у вас не может быть доступа ко всем доступным типам контента, если вы не используете службу 'entity.manager' или не заглядываете в таблицу {config}, в которой есть столбец с именем name, но в столбце name вы найдете следующее:

node.type.CONTENT_TYPE_MACHINE_NAME1
node.type.CONTENT_TYPE_MACHINE_NAME2

Не существует простого способа получите информацию из этой таблицы.

Я нашел пример на странице Поддержка запросов сущностей для агрегированных запросов :

Предположим, вам нужно количество узлов для каждого типа узла.

$query = Drupal::entityQueryAggregate('node');

$result = $query
  ->groupBy('type')
  ->aggregate('nid', 'COUNT')
  ->execute();

Но работает только для типов контента с более чем 1 узлом, почему? Опять же, в базе данных невозможно найти типы контента, у которых нет узлов.

Я действительно не знаю причины отсутствия этой важной части (и я не могу ее найти), но я думаю, что это очень важно, потому что теперь единственный способ получить метку типа контента - через службу "entity.manager".

Короче говоря, как получить все типы контента, у которых нет узлов?

Author: Adrian Cid Almaguer, 2017-05-05

1 answers

Я знаю, что вы можете использовать службу "entity.manager", чтобы получить все доступные типы контента, а затем с помощью цикла искать все узлы для каждого типа контента. Но этот путь очень длинный и включает в себя множество запросов к базе данных.

Вот короткий способ, который я нашел для получения этой информации:

// Getting the database connection.
$connection = \Drupal::service('database');
$query_content_types = "SELECT DISTINCT SUBSTR(name, 11) as type FROM config WHERE name LIKE 'node.type.%'";
// Creating a temporary table.
$content_types_temporary_table_name = $connection->queryTemporary($query_content_types);

$query = "SELECT node_type.type, COUNT(nid) AS total
          FROM $content_types_temporary_table_name node_type LEFT JOIN {node} USING(type)
          GROUP BY type
          HAVING COUNT(nid) = 0
          ORDER BY type ASC";

$result = $connection->query($query);
dpm($result->fetchCol('type'));
 3
Author: Adrian Cid Almaguer, 2017-05-05 16:20:12