Php 使用db_或()的这些Drupal SQL查询有什么问题?
我工作的机构在Drupal CMS和LDAP服务器之间有一个现有的和正在运行的集成。这种集成的一个特性是能够从LDAP中提取记录来填充Drupal中的字段。我们使用定制模块告诉Drupal要填充哪些字段和内容类型,这些模块最初设计为只容纳(1)一个内容类型的单一机器名和(2)每个字段的单一机器名 我们现在正试图修改这些配置项,使其以逗号分隔的列表形式存在,这样我们就可以向不一定使用共享字段的任意数量的内容类型提供LDAP信息。对(2)的修改,即为一个字段输入多个机器名,并且仍然用所需数据填充该字段的功能,已经开始工作。但是,完成(1)所需的修改将允许记录输出到多个内容类型,这取决于SQL查询,我相信我一定是弄错了它的语法 存储内容类型的机器名的配置项在Drupal内部称为Php 使用db_或()的这些Drupal SQL查询有什么问题?,php,mysql,sql,drupal,drupal-7,Php,Mysql,Sql,Drupal,Drupal 7,我工作的机构在Drupal CMS和LDAP服务器之间有一个现有的和正在运行的集成。这种集成的一个特性是能够从LDAP中提取记录来填充Drupal中的字段。我们使用定制模块告诉Drupal要填充哪些字段和内容类型,这些模块最初设计为只容纳(1)一个内容类型的单一机器名和(2)每个字段的单一机器名 我们现在正试图修改这些配置项,使其以逗号分隔的列表形式存在,这样我们就可以向不一定使用共享字段的任意数量的内容类型提供LDAP信息。对(2)的修改,即为一个字段输入多个机器名,并且仍然用所需数据填充该字
dart\u netid\u content\u type
。以下是旧代码,它适用于标识单个内容类型的单个计算机名称:
// All nodes of type from dart_netid_content_type, with either no LDAP lookup time, or over 24 hours ago
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
->fields('ldap', array('nid', 'ldap_updated'))
->condition('type', variable_get('dart_netid_content_type', ''), '=')
->condition('status', '1', '=')
->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
->orderby('ldap_updated', 'ASC');
为了更直观地表达这两个版本之间的预期差异:dart\u netid\u content\u type
现在可以是一种或多种内容类型。上一个查询正在搜索类似于的内容,其中type=dart\u netid\u content\u type
。我现在试图劝说它做的是查看dart\u netid\u content\u type\u数组中的单个项目,并创建一个类似的查询,其中(type=dart\u netid\u content\u type\u数组[0])或(type=dart\u netid\u content\u type\u数组[1]),或。。。或者(type=dart\u netid\u content\u type\u array[sizeof(dart\u netid\u content\u type\u array)])
在Drupal的db_查询和db_或语法中包装此内容时,我的逻辑似乎有问题
如果需要,我可以通过共享更多驱动LDAP到节点功能的自定义模块来提供更多上下文
提前感谢您的帮助。使用in确定内容类型是否在值数组中如何?大概是这样的:
$dart_ct_array = explode(",", variable_get('dart_netid_content_type', ''));
$dart_netid_content_types = "('" . implode("','", $dart_ct_array) . "')";
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
->fields('ldap', array('nid', 'ldap_updated'))
->condition('type', $dart_netid_content_types, 'IN')
->condition('status', '1', '=')
->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
->orderby('ldap_updated', 'ASC');
$dart\u ct\u array=explode(“,”,variable\u get('dart\u netid\u content\u type',”);
$dart\u netid\u content\u types=“(”。内爆(“,”,$dart\u ct\u数组)。“)”;
$query=db_select('node');
$query->leftjoin('dart_ldap_update','ldap','node.nid=ldap.nid');
$query->fields('node',array('nid'))
->字段('ldap',数组('nid','ldap\U更新'))
->条件('type',$dart\u netid\u content\u types,'IN')
->条件('status','1','=')
->条件(db_或()->condition('ldap_updated',NULL',IS')->condition('ldap_updated',$limit,'您能转储这两个变体生成的实际SQL吗?除了这段代码比我的代码更干净之外,它还让我了解了实际问题!在SQL查询之外,还有另一段代码,它基本上运行if($node->type==dart_netid_content_type){foo()}
未进行更新,以反映省道内容类型已转换为数组的事实。该问题已得到纠正,自定义现在可以正常工作!谢谢!
$dart_ct_array = explode(",", variable_get('dart_netid_content_type', ''));
$dart_netid_content_types = "('" . implode("','", $dart_ct_array) . "')";
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
->fields('ldap', array('nid', 'ldap_updated'))
->condition('type', $dart_netid_content_types, 'IN')
->condition('status', '1', '=')
->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
->orderby('ldap_updated', 'ASC');