【问题标题】:Drupal Views alter Filter to CAST() string as FloatDrupal 视图将过滤器更改为 CAST() 字符串作为浮点数
【发布时间】:2016-01-29 18:14:36
【问题描述】:

我遇到了一个问题,改变了我的视图,以便它过滤一个字符串字段(我知道只能有数字,但不能改变这种情况),以便将其作为数字处理......

通常我可以通过使用“CAST”来实现这一点......问题是,它在钩子中被改变了,所以我的示例如下所示:

... AND (CASTfield_data_field_baserent.field_baserent_valueASDECIMAL <= '1000') ))

所以所有多余的字符都会被删除... :-/

我尝试了很多钩子,但似乎没有一个能胜任! 有谁有想法,我该怎么做?! (模块计算字段并不是一个真正的选项..)

我当前的代码如下:

function custom_helpers_views_query_alter(&$view, &$query){
if($view->name=="mietangebote"){
    // Miete
        if(!empty($view->exposed_raw_input['field_baserent_value'])){
            foreach($query->where[1]['conditions'] as $key=>$condition){
                if($condition['field']=="field_data_field_baserent.field_baserent_value"){
                    $view->query->where[1]['conditions'][$key]['operator']="<=";
                    $view->query->where[1]['conditions'][$key]['value']=(double)$view->query->where[1]['conditions'][$key]['value'];
                    $view->query->where[1]['conditions'][$key]['field']="CAST(".$view->query->where[1]['conditions'][$key]['field']." AS DECIMAL)";
                    //dpm($view->query->where[1]['conditions'][$key]);
                }
            }
        }
    }
}

在哪里

$view->query->where[1]['conditions'][$key]['field']="CAST(".$view->query->where[1]['conditions'][$key]['field']." AS DECIMAL)";

是重要的线

提前感谢:)

【问题讨论】:

    标签: mysql drupal drupal-7 views hook


    【解决方案1】:

    hook_views_query_alter 函数应该可以完成这项工作,它应该是这样的:

    function custom_helpers_views_query_alter(&$view, &$query) {
      if ( $view->name == 'mietangebote' ) {
    
        // Miete
        if(!empty($view->exposed_raw_input['field_baserent_value'])){
    
          foreach($query->where[1]['conditions'] as $key => $condition) {
            if ( $condition['field'] == 'field_data_field_baserent.field_baserent_value' ) {
              $query->where[1]['conditions'][$key]['operator'] = 'formula';
              $query->where[1]['conditions'][$key]['value'] = array(':val' => (double)$query->where[1]['conditions'][$key]['value']); 
              $query->where[1]['conditions'][$key]['field'] = 'CAST(' . $query->where[1]['conditions'][$key]['field'] . ' AS UNSIGNED) >= :val';
              //dpm($view->query->where[1]['conditions'][$key]);
              break; 
            }
          }
    
          // For sorting as well
          foreach($query->orderby as $key => $condition) {
            if ( $condition['field'] == 'field_data_field_count_field_count_value' ) {              
              $query->orderby[$key]['field'] = 'CAST(' . $query->orderby[$key]['field'] . ' AS UNSIGNED)'; 
              break; 
            }
          }
        }
      }
    }
    

    重要的一行是:

    $query->where[1]['conditions'][$key]['operator'] = 'formula';
    

    并允许视图将“字段”的值视为 SQL sn-p 而不是字段名称。查看add_where_expression的源代码以获取完整的详细信息! [doc]

    祝你好运!

    免责声明:此答案与question from drupal.stackexchange.com 非常相似。修改代码以解决特定问题(不仅仅是复制+粘贴)。

    【讨论】:

      【解决方案2】:

      不用CAST,只需构建一个表达式,将0+ 附加到变量和/或常量上:

      0+'1000'
      

      将被视为 numeric1000,而不是 字符串 '1000'

      【讨论】:

        【解决方案3】:

        看看有没有办法自己通过条件,像这样:

        $view->query->where[1]['conditions'][$key]->condition("CAST(".$view->query->where[1]['conditions'][$key]['field']." AS DECIMAL) <= " . $view->query->where[1]['conditions'][$key]['value']);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-08
          • 2023-03-17
          • 2018-03-17
          相关资源
          最近更新 更多