You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal 7中如何在DB Select查询中循环处理指定数组?

在Drupal 7的db_select中处理关联数组的查询条件

嘿,我看你现在有个关联数组Array ( [71] => adad [85] => erer ),想在get_values函数里用它来过滤查询结果对吧?其实根本不需要循环处理这个数组——Drupal的数据库API已经帮你搞定批量条件的事儿了,而且比循环高效得多,我给你捋清楚怎么改:

首先,你的数组里键是节点ID(71、85),值是其他内容,而我们的查询是要筛选nid等于这些键的节点,所以第一步要把这些键提取出来,直接用整个关联数组的话,Drupal会把值也当成条件的一部分,这就错了。

然后看你原来代码里的假设部分,我帮你修改成正确的写法:

修改后的核心条件代码

// 先检查传入的数组是否非空(你原来的$room_selected变量应该是笔误,函数参数是$array)
if (!empty($array)) {
  // 提取数组的键,也就是我们需要的nid列表
  $nid_list = array_keys($array);
  // 用IN条件过滤nid,Drupal会自动把数组转换成SQL的IN子句
  $q->condition('n.nid', $nid_list, 'IN');
}

为什么不用循环?

要是你循环数组去多次调用condition,默认会生成n.nid = 71 AND n.nid = 85这种矛盾的条件,根本查不到数据。而用数组+IN条件,Drupal会自动生成n.nid IN (71, 85),这才是我们要的批量筛选效果。

完整的修改后函数

function get_values($array){
  $q = db_select('node', 'n');
  $q->join('ab', 'f', 'n.nid = f.entity_id');
  $q->condition('n.type', 'book');

  // 处理传入的数组,过滤指定nid的节点
  if (!empty($array)) {
    $nid_list = array_keys($array);
    $q->condition('n.nid', $nid_list, 'IN');
  }

  // 别忘了执行查询并获取结果,原来的代码缺了这一步哦
  $rooms_data = $q->fields('n', array('nid', 'title'))
                  ->fields('f', array('feesid'))
                  ->orderBy('n.title') // 补全你原来的orderBy部分
                  ->execute()
                  ->fetchAll();

  return $rooms_data;
}

几个小提醒

  • 你原来的代码里用了$room_selected,但函数参数是$array,应该是变量名写错了,改成检查$array是否非空更合理。
  • 一定要调用execute()和fetchAll()(或者fetchAssoc()等),不然只是构建了查询对象,不会返回实际的数据。
  • 如果你的数组值(比如'adad'、'erer')也需要用到查询里,可以再添加对应的条件,但从当前需求看,只需要nid过滤的话,提取键就足够了。

内容的提问来源于stack exchange,提问作者Madhu Nair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:23:58