Drupal 视图过滤器中的 OR 运算符
Posted
技术标签:
【中文标题】Drupal 视图过滤器中的 OR 运算符【英文标题】:OR operator in Drupal View Filters 【发布时间】:2009-08-27 11:20:36 【问题描述】:我需要在 Drupal 视图中的一些过滤器之间实现 OR 运算符。 默认情况下,Drupal 将每个过滤器合并在一起。
通过使用
hook_views_query_alter(&$view, &$query)
我可以访问查询 (var $query),我可以更改任何一个:
$query->where[0]['type']
到“或”,或
$query->group_operator
到“或”
但问题是,我不需要到处都是 OR。我尝试将它们分别更改为 OR,但并没有产生预期的结果。
似乎改变了这些值,把 OR 放在任何地方,而我需要 =>(过滤器 1 和过滤器 2)或(过滤器 3),所以只有 1 个或。
我可以只检查视图的查询,复制它,修改它,然后通过 db_query 运行它,但这很脏..
有什么建议吗?
提前致谢。
【问题讨论】:
作为第二个,还有使用查询alter来查看视图——我将尝试这条路线。 brianfending.com/content/… 查询更改是@Vodde 所指的“脏”,我们正在尝试通过 Views API 调用修改查询子句。 最好指定 Drupal 和 Views 版本。 【参考方案1】:如果您使用 Views 3 / Drupal 7 并寻找这个问题的答案,它会直接融入 Views。在过滤器旁边显示“添加”的位置,单击下拉菜单,然后单击“和/或;重新排列”。从那里应该很明显。
【讨论】:
为此+1,它完全符合我的需要。到达那里后,还要查看字段组。那是我花了几分钟才意识到的唯一部分 我有视图 3,但我没有看到“和/或;”只是“重新排列”?【参考方案2】:不幸的是,这仍然是 Views2 中缺少的功能。 It has long been asked for 并在不久前得到承诺,但似乎是一项棘手的工作和is now scheduled for Views3。
与此同时,您可以尝试该线程中提到的Views Or 模块。截至今天,它仍处于开发状态,但似乎正在积极维护中,the issue queue 看起来不错,所以您可能想尝试一下。
【讨论】:
+1 这不在 Views2 中。$this->query->where[$group]['type'] = 'OR';
不起作用,$this->query->group_operator = 'OR';
将 WHERE 子句之间的所有运算符转换为 OR。非常令人沮丧。【参考方案3】:
如果你想用 view_query_alter 钩子来做,你应该使用 $query->add_where() 你可以指定它是 AND 还是 OR。来自views/include/query.inc
/**
* Add a simple WHERE clause to the query. The caller is responsible for
* ensuring that all fields are fully qualified (TABLE.FIELD) and that
* the table already exists in the query.
*
* @param $group
* The WHERE group to add these to; groups are used to create AND/OR
* sections. Groups cannot be nested. Use 0 as the default group.
* If the group does not yet exist it will be created as an AND group.
* @param $clause
* The actual clause to add. When adding a where clause it is important
* that all tables are addressed by the alias provided by add_table or
* ensure_table and that all fields are addressed by their alias wehn
* possible. Please use %d and %s for arguments.
* @param ...
* A number of arguments as used in db_query(). May be many args or one
* array full of args.
*/
function add_where($group, $clause)
【讨论】:
我自己尝试过,使用这种方法得到( filter 1 OR filter 2 ) AND ( filter 3 OR fliter 4 )
,这与我们正在寻找的相反:( filter 1 AND filter 2 ) OR ( filter 3 AND filter 4 )
。【参考方案4】:
我通过连接字符串添加它。
它是相对特定于实现的 - 人们需要使用字段来匹配 OR - 以下代码中的 node.title 和匹配它的字段 - 在这种情况下是 node_revisions.body 。
额外的代码确保 node_revisions.body 在查询中。
/**
* Implementation of hook_views_api().
*/
function eventsor_views_api() // your module name into hook_views_api
return array(
'api' => 2,
// might not need the line below, but in any case, the last arg is the name of your module
'path' => drupal_get_path('module', 'eventsor'),
);
/**
*
* @param string $form
* @param type $form_state
* @param type $form_id
*/
function eventsor_views_query_alter(&$view, &$query)
switch ($view->name)
case 'Events':
_eventsor_composite_filter($query);
break;
/**
* Add to the where clause.
* @param type $query
*/
function _eventsor_composite_filter(&$query)
// If we see "UPPER(node.title) LIKE UPPER('%%%s%%')" - then add and to it.
if (isset($query->where))
$where_count = 0;
foreach ($query->where as $where)
$clause_count = 0;
if (isset($where['clauses']))
foreach ($where['clauses'] as $clause)
$search_where_clause = "UPPER(node.title) LIKE UPPER('%%%s%%')";
// node_data_field_long_description.field_long_description_value
$desirable_where_clause = "UPPER(CONCAT_WS(' ', node.title, node_revisions.body)) LIKE UPPER('%%%s%%')";
if ($clause == $search_where_clause)
// $query->add_where('or', 'revisions.body = %s'); - outside of what we are looking for
$query->where[$where_count]['clauses'][$clause_count] = $desirable_where_clause;
// Add the field to the view, just in case.
if (!isset($query->fields['node_revisions_body']))
$query->fields['node_revisions_body'] = array(
'field' => 'body',
'table' => 'node_revisions',
'alias' => 'node_revisions_body'
);
$clause_count++;
$where_count++;
【讨论】:
以上是关于Drupal 视图过滤器中的 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章