Drupal多表SQL条件子句问题:Drupal7 FAQ查询无法新增表
解决Drupal 7 FAQ搜索模块添加第三个表的问题
先帮你梳理下当前代码里的核心问题——这些问题不仅会导致你加不了第三个表,甚至当前的双表查询逻辑都可能存在偏差:
1. 逻辑运算符优先级踩坑
原查询里OR f.body_value LIKE :term AND f.entity_id = fq.nid的写法有问题:AND的优先级比OR高,实际执行时会先计算f.body_value LIKE :term AND f.entity_id = fq.nid,再和前面的fq.title LIKE :term OR fq.type LIKE :term做OR运算,这完全不符合你“关联节点表和字段表后再搜索”的预期。
2. 占位符绑定不规范
你代码里重复写了两次:term赋值,虽然Drupal的db_query能处理,但这是冗余写法,而且容易混淆。
3. 添加第三个表的正确姿势
假设你要加的第三个表是field_data_field_faq_tags(比如存储FAQ标签的字段表,字段值存在field_faq_tags_value),下面是修正后的完整代码,同时优化了查询逻辑:
$term = strip_tags(drupal_substr($_POST['keyword'], 0, 100)); // 用JOIN替代旧的逗号分隔表写法,关联关系更清晰 $query = " SELECT DISTINCT fq.title, fq.nid FROM {node} AS fq LEFT JOIN {field_data_body} AS f ON f.entity_id = fq.nid LEFT JOIN {field_data_field_faq_tags} AS t ON t.entity_id = fq.nid WHERE ( fq.title LIKE :term OR fq.type LIKE :term OR f.body_value LIKE :term OR t.field_faq_tags_value LIKE :term ) AND fq.type = 'faq' -- 建议加上,只搜索FAQ类型节点,避免无关结果 "; // 用db_like转义特殊字符,避免SQL注入和意外匹配 $result = db_query($query, array(':term' => '%' . db_like($term) . '%'));
关键修改说明
- 改用LEFT JOIN:比逗号分隔表的写法更直观,能明确看到表之间的关联逻辑,后续加新表也更方便。
- 括号包裹OR条件:把所有搜索相关的LIKE语句用括号括起来,再和关联条件、节点类型过滤用AND连接,保证逻辑完全符合预期。
- 用
db_like()安全处理搜索词:自动转义%、_这类SQL通配符,避免恶意注入或者非预期的匹配结果,比直接拼接%更安全。 - 新增节点类型过滤:加上
fq.type = 'faq'后,只会搜索FAQ类型的节点,更贴合你的模块定位。
如果你的第三个表不是标签字段,只需要替换对应的表名和字段名就行——比如要加分类字段field_data_field_faq_category,就改成LEFT JOIN {field_data_field_faq_category} AS c ON c.entity_id = fq.nid,然后在WHERE的括号里加上OR c.field_faq_category_value LIKE :term。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

