Drupal 7数据库插入异常:获取10条结果却仅插入单条记录
问题分析与解决方案
我来帮你排查下这个问题,其实核心是Drupal 7多值字段的赋值逻辑你没搞对,还有可能查询的字段和实际需要的不匹配,具体来看:
问题根源
- 多值字段赋值错误:你把包含10条记录的
$result数组直接塞给了字段的[0]['nid']位置——但Drupal的多值字段要求每个条目对应一个独立的delta索引(也就是[0]、[1]、[2]...),你现在只给第一个索引位置赋值,自然只会存一条记录。 - 字段不匹配(潜在问题):你的查询只获取了
filename字段,但field_select_images是节点引用字段,需要的是nid值——这说明你要么查询错了字段,要么需要额外逻辑把filename映射到对应的节点nid。
修复步骤
情况1:你的network_drive_listing表本身包含nid字段
如果表中直接有你需要的节点nid,那可以这样修改代码:
// 加载节点 $node = node_load($node->nid); $language = $node->language; // 查询获取nid的一维数组(用fetchCol更高效) $nids = db_select('network_drive_listing', 'n') ->fields('n', array('nid')) // 改成获取nid字段 ->condition('n.is_dir', 0) ->distinct() ->range(0, 10) ->execute() ->fetchCol(); // 清空原有字段值(可选,根据需求保留或覆盖) $node->field_select_images[$language] = array(); // 循环赋值到多值字段的每个delta位置 foreach ($nids as $index => $nid) { $node->field_select_images[$language][$index]['nid'] = $nid; } // 一定要保存节点!这步不能忘 node_save($node);
情况2:需要通过filename关联到节点nid
如果network_drive_listing的filename对应某个节点类型的标题(比如图片节点的标题),那需要先查询对应节点的nid:
$node = node_load($node->nid); $language = $node->language; // 先获取所有filename $filenames = db_select('network_drive_listing', 'n') ->fields('n', array('filename')) ->condition('n.is_dir', 0) ->distinct() ->range(0, 10) ->execute() ->fetchCol(); // 查询这些filename对应的节点nid(替换成你的节点类型,比如'image') $nids = db_select('node', 'n') ->fields('n', array('nid')) ->condition('n.type', 'image') ->condition('n.title', $filenames, 'IN') ->execute() ->fetchCol(); // 赋值到多值字段 $node->field_select_images[$language] = array(); foreach ($nids as $index => $nid) { $node->field_select_images[$language][$index]['nid'] = $nid; } node_save($node);
关键提醒
fetchCol()比fetchAll()更适合只取单个字段的场景,它直接返回一维数组,处理起来更方便。- 多值字段的每个条目必须对应独立的delta索引,不能把整个结果数组直接赋值给单个索引位置。
- 最后一定要调用
node_save($node),否则你的修改不会写入数据库——看你原代码里没写这步,这也可能是导致数据没插入的原因之一!
内容的提问来源于stack exchange,提问作者syed1234
相关产品推荐
相关产品推荐

