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
相关产品推荐
相关产品推荐

