首页 > 解决方案 > ColdFusion 在基于脚本的 cfc 函数中使用 if 条件

问题描述

我正在努力提高我的 cfscript 并且无法弄清楚这一点。在基于标签的 CFC 中,我可以执行以下操作:

<cffunction name="querySd" access="public" returnType="query" output="false">
  <cfargument name="sd_id" type="numeric" required="No"/>
  <cfargument name="sd_code" type="string" required="No"/>
  <cfquery name="LOCAL.qrySd" datasource="#variables.dsn#">
    SELECT sd_id, sd_code, sd_active, sd_expires, sd_added, sd_dla
     FROM sd 
    WHERE 0=0
     <cfif isDefined("ARGUMENTS.sd_id")>
       AND sd_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ARGUMENTS.sd_id#"/>
     </cfif>
     <cfif isDefined("ARGUMENTS.sd_code")>
      AND sd_code = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#ARGUMENTS.sd_code#" maxlength="20"/>
     </cfif>
    </cfquery>
  <cfreturn LOCAL.qrySd>
</cffunction>

但是,在 cfscript 中尝试类似的方法会引发错误:

public query function querySd( numeric sd_id, string sd_code ){
  local.querySd = new Query(datasource = variables.dsn);
  if( isDefined('arguments.sd_id') ){
    local.querySd.addParam( name = 'sdid', value = arguments.sd_id, cfsqltype = 'cf_sql_int');
  };
  if( isDefined('arguments.sd_code') ){
    local.querySd.addParam( name = 'sdcode', value = arguments.sd_code, cfsqltype = 'cf_sql_varchar', maxlength = '20');
  };

 local.querySd.setSql('
            SELECT sd_id, sd_code, sd_active, sd_expires, sd_added, sd_dla
              FROM sd
             WHERE 0 = 0
             if( isDefined('arguments.sd_id') ){
                 AND sd_id = :sdid 
             };
             if( isDefined('arguments.sd_code') ){
                 AND sd_code = :sdcode 
             };
        ');
local.qrySd = local.querySd.execute().getResult();

在 cfc 内基于 cfscript 的查询中使用可选参数的正确方法是什么?

标签: coldfusioncfml

解决方案


您可以将查询的一部分放在一个变量中,并在查询字符串中使用它。

local.queryPart = '';
if( isDefined('arguments.sd_id') ){
    local.queryPart &= ' AND sd_id = :sdid ';
};
if( isDefined('arguments.sd_code') ){
    local.queryPart &= ' AND sd_code = :sdcode ';
};
local.querySd.setSql('
    SELECT sd_id, sd_code, sd_active, sd_expires, sd_added, sd_dla
    FROM sd
    WHERE 0 = 0
    #local.queryPart#
');

推荐阅读