【问题标题】:How to Override Drupal Views Query?如何覆盖 Drupal 视图查询?
【发布时间】:2010-11-15 18:07:20
【问题描述】:

如何在代码中将 Views 3 查询替换为自定义 SQL 查询?

【问题讨论】:

  • Views 3 仍处于 Alpha 阶段。你确定 Views 2 不能做你想做的事吗?
  • 是的,视图 3 是必需的。根据我的经验,Views 3 在这一点上似乎相对成熟。
  • 您能详细说明一下吗?我的意思是 - 如果你要完全覆盖查询,那么为什么要使用视图呢?
  • 一个例子是,如果一个组件最初是作为视图构建的,并以这种形式进行主题化,然后需求发生变化,因此所需的查询对于视图来说太复杂而无法创建。最好只替换视图的查询,从而确保输出的样式不受影响。

标签: drupal drupal-views


【解决方案1】:

据我了解,您可以使用hook_views_query_alter 来修改查询。我假设您也可以使用它来替换查询。这里有几个 hook_views_query_alter 示例,可以帮助您入门:

【讨论】:

    【解决方案2】:

    这可能不再与您相关,但在 Drupal.org 上 Implementing custom SQL query for Views / Filters 上似乎有一个非常有用的讨论,看起来它正在回答我的类似问题。

    特别是,最初的海报建议附加到钩子views_views_pre_execute,其他人提到可以将其放入自定义模块中,例如:

    function mymodulename_views_pre_execute(&$view) {
       if($view->name=="groups_list2") {
          // ...
          $view->build_info['query'] = "SELECT node.nid AS nid ".
             "FROM node WHERE node.type='%s'"; // wrapped for legibility
       }
    }
    

    另一张海报提到了mySQL ViewsTable Wizard (direct link),尽管他们确实提到值得牢记this article about mySQL Views performance

    这绝对值得阅读 Drupal.org 上的整个帖子,因为我发现它非常有用;我希望其他人也这样做。

    更新:确实,这正是我们现在正在做的——在自定义模块中覆盖views_views_pre_execute,以便在新SQL 到达数据库之前注入它。我在 Drupal.SE Slow query with large dataset in Drupal views — better to process in SQL or PHP? 上提出了一个类似(但更具体)的问题,您可能会发现它很有用。

    【讨论】:

      【解决方案3】:

      如果您想执行自定义 SQL(View 无法生成),例如计算字段或复杂的 SQL 连接,那么您需要的是自定义模块。

      请参阅 drupal 获取入门指南

      【讨论】:

      • 明白。我正在寻找更多可以用来覆盖 SQL 查询的视图挂钩。
      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多