Drupal 7节点关联文件的数据库表查询及CMS数据迁移需求
获取Drupal 7节点关联文件列表的方法
核心逻辑
Drupal 7的文件/附件字段采用动态字段表存储,每个附件字段对应独立的field_data_field_XXX表(XXX为字段名,比如field_attachments),节点与文件的关联关系就存在这些表中,而非直接存储在file_managed或media_field_data里。
具体操作步骤
确定目标节点的内容类型
先查询节点135的内容类型,缩小字段表范围:SELECT type FROM node WHERE nid = 135;假设返回结果为
news(即该节点属于新闻内容类型)。定位对应的附件字段表
在数据库中查找所有以field_data_field_开头的表,筛选出bundle字段值为news(上一步得到的内容类型)且entity_type为node的表,这些表就是该内容类型的字段存储表。
常见的表名比如field_data_field_pdf_attachments、field_data_field_media_files,其中的field_XXX就是附件字段的名称。查询节点关联的文件数据
以找到的field_data_field_attachments表为例,执行以下SQL关联file_managed表获取文件详情:SELECT fm.fid, fm.filename, fm.uri, fm.filemime, fm.created FROM field_data_field_attachments fa LEFT JOIN file_managed fm ON fa.field_attachments_fid = fm.fid WHERE fa.entity_type = 'node' AND fa.entity_id = 135;如果网站使用了Media模块,需要额外关联
media表:SELECT m.mid, fm.fid, fm.filename, fm.uri, fm.filemime, fm.created FROM field_data_field_media_attachments fa LEFT JOIN media m ON fa.field_media_attachments_fid = m.mid LEFT JOIN file_managed fm ON m.fid = fm.fid WHERE fa.entity_type = 'node' AND fa.entity_id = 135;
通用查询方法(快速定位所有关联文件)
如果不确定字段名,可以逐个排查field_data_field_开头的表,每个表执行类似步骤3的查询;或者用以下SQL遍历所有可能的字段表:
SELECT DISTINCT fm.fid, fm.filename, fm.uri, fm.filemime, fdf.field_name FROM file_managed fm JOIN field_config fc ON fc.type = 'file' JOIN field_data_field_${fc.field_name} fdf ON fdf.${fc.field_name}_fid = fm.fid WHERE fdf.entity_type = 'node' AND fdf.entity_id = 135;
内容的提问来源于stack exchange,提问作者charll
相关产品推荐
相关产品推荐

