Как получить все типы контента, у которых нет узлов?
В 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".
Короче говоря, как получить все типы контента, у которых нет узлов?
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'));