LIKE子句在钩子查询alter中不起作用


9

我试图用Drupal 7中的LIKE子句替换默认搜索。我试图根据向现有查询中添加OR条件来更改查询

function MYMODULE_query_node_access_alter(QueryAlterableInterface $query) {
  foreach ($query->getTables() as $table) {
    // LIKE for search results.
    if ($table['table'] == 'search_index') {
      // Get the query args and then the search term
      $args =& $query->getArguments();
      $search = $args[':db_condition_placeholder_1'];

      // Get a reference to the existing query conditions.
      $conditions =& $query->conditions();

      // Save the former conditions
      $former_conditions = $conditions;

      // Reset the condition array. It needs a default #conjunction for which AND is fine
      $conditions = array('#conjunction' => array_shift($former_conditions));

      // Replace the search condition in the query
      foreach ($former_conditions as $key => $condition) {
        if ($key != 1) {
          $query->condition($condition['field'], $condition['value'], $condition['operator']);
        }
        else {
          $query->condition('i.word', '%' . db_like($search) . '%', 'LIKE');
        }
      }
    }
  }
}

使用单词“ declaration”进行搜索将显示与默认的drupal搜索相同的结果,但是使用“ decl”进行搜索将找不到任何结果。

有什么想法为什么我的代码不起作用?


1
drupal.org/project/fuzzysearch模块应该可以解决您的问题。你可以给它一个尝试..
阿尼尔·萨格尔

谢谢。我希望使用hook_query_alter(如果可能)的解决方案,因为已经设置了搜索表单和结果页面。我也想知道为什么我的代码无法用于其他用例。
user9932 2012年

1
似乎您已经完成了90%的工作,只需要最后一部分才能使其起作用,但我认为您的做法是错误的。有很多搜索模块可以处理各种用例,我敢肯定您会找到一个可以解决您的问题的模块。使用这种干预措施可能会导致混乱和不可维护性。
艾伦·迪克森

您是否尝试过打印$search变量中携带的内容?$ search = $ args [':db_condition_placeholder_1']; 如果是从观点出发hook_views_query_alter(),那就简单了。

Answers:


0

您是否尝试过更改要使用的挂钩MYMODULE_query_alter

您正在实现hook_query_TAG_alter(),但看不到Search查询被标记为何处。

根据Node API

这是标记为“ node_access”的查询的hook_query_alter()。它为“帐户”元数据(如果未提供,则为全局$ user)给出的用户帐户,为“操作”元数据(如果未提供,为“视图”)给出的操作添加节点访问检查。可能的值是“更新”和“删除”)


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

使用它并在view->query设置中添加标签名称。通过使用此功能,您也可以区分视图。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.