如何用SQL获取本地Drupal 10实例的所有内容类型、字段及数据?
在Drupal 10中通过SQL获取内容类型及关联字段数据
Drupal的内容数据采用实体-字段的分散存储模式,无法直接通过单表获取完整内容,需要关联多个核心表来提取信息。以下是具体的SQL查询方案:
1. 获取所有内容类型的基础信息
SELECT bundle AS content_type, name AS content_type_label FROM node_type;
2. 获取指定内容类型(如article)的完整字段数据
以article为例,关联正文、标签、文件等常见字段的查询语句:
SELECT n.nid AS node_id, n.title, -- 正文字段 b.body_value AS body_content, b.body_format AS body_format, -- 标签字段(合并多值标签的名称和ID) GROUP_CONCAT(DISTINCT ttd.name SEPARATOR ', ') AS tags, GROUP_CONCAT(DISTINCT ttd.tid SEPARATOR ', ') AS tag_ids, -- 文件字段(获取文件ID、路径和名称) fm.fid AS file_id, fm.uri AS file_uri, fm.filename AS file_name FROM node_field_data n -- 关联正文字段表 LEFT JOIN node__body b ON n.nid = b.entity_id AND n.vid = b.revision_id -- 关联标签字段表及分类术语表 LEFT JOIN node__field_tags ft ON n.nid = ft.entity_id AND n.vid = ft.revision_id LEFT JOIN taxonomy_term_field_data ttd ON ft.field_tags_target_id = ttd.tid -- 关联文件引用字段表及文件管理表(字段名需根据实际调整) LEFT JOIN node__field_media fm_ref ON n.nid = fm_ref.entity_id AND n.vid = fm_ref.revision_id LEFT JOIN file_managed fm ON fm_ref.field_media_target_id = fm.fid WHERE n.bundle = 'article' GROUP BY n.nid, n.title, b.body_value, b.body_format, fm.fid, fm.uri, fm.filename;
3. 获取内容类型对应的字段定义信息
如果需要确认某个内容类型包含哪些字段,可以查询字段配置表:
SELECT fc.field_name, fc.type AS field_type, fci.label AS field_label, fci.bundle AS content_type FROM field_config fc JOIN field_config_instance fci ON fc.id = fci.field_id WHERE fc.entity_type = 'node' ORDER BY fci.bundle, fc.field_name;
注意事项
- 字段表命名规则为
node__[field_name],比如自定义字段field_image对应的表是node__field_image,需根据实际字段名调整查询中的表名 - 多值字段(如标签)需用
GROUP_CONCAT合并多个值 - 若要获取所有内容类型的数据,只需去掉
WHERE n.bundle = 'article'条件即可
内容的提问来源于stack exchange,提问作者bero
相关产品推荐
相关产品推荐

