【问题标题】:Where to put queries (especially long ones) in a CFWheels project在 CFWheels 项目中放置查询(尤其是长查询)的位置
【发布时间】:2014-12-18 23:30:31
【问题描述】:

(这里是轮子新手)

我正在尝试找出放置视图控制器功能中使用的大量大型和/或复杂查询的最佳位置。

我有一个视图calendar.cfm,和一个具有该功能的控制器:

<cffunction name="calendar">

    <cfset formData = getValidatedFormData()>
    <cfset fromDate = formData.fromDate>
    <cfset toDate = formData.toDate>
    <cfset dbLocation = formData.dbLocation>

    <cfset dateList = getDateList()>

    <cfset selectLists = getSelectLists()>
    <cfset companySelectList = selectLists.companySelectList>
    <cfset activitySelectList = selectLists.activitySelectList>
    <cfset instructorSelectList = selectLists.instructorSelectList>
    <cfset statusSelectList = selectLists.statusSelectList>

    <cfset courseNumberLists = getCourseNumberLists()>
    <cfset girsCourseNumberList = courseNumberLists.girsCourseNumberList>
    <cfset activityCourseNumberList = courseNumberLists.activityCourseNumberList>
    <cfset activityCourseNumberList = courseNumberLists>

    <cfset ELMActivityList = getELMActivityList()>
    <cfset activityList = getActivityList()>    

    <cfif len(elmActivityList.LM_ACT_CD) gt 0>
        <cfset elmActIDList = Replace(QuotedValueList(ELMActivityList.LM_ACT_CD, ","), "'',", "", "all")>
    <cfelse>
        <cfset elmActIDList = "'String1','String2'">
    </cfif>


    <cfif len(activityList.girs_act_cd) gt 0>
        <cfset girsActIDList = Replace(QuotedValueList(activityList.GIRS_ACT_CD, ","), "'',", "", "all")>
    <cfelse>
        <cfset girsActIDList = "'String1','String2'">
    </cfif>

    <cfset combinedList = getCombinedList( elmActIDLIst , girsActIDList )>

    <cfset needUnion = false>

    <cfset programList = getProgramList()>

</cffunction>

每个函数,例如getDateList(),都包含长的和/或复杂的查询。控制器已经有将近 700 行长,而且我只实现了项目中的 5 或 6 个视图之一——这将需要额外的查询。

我觉得我做错了。我尝试将所有查询函数放在模型文件夹中的 cfc 文件中

<cfcomponent extends="Model">
    functions...

但我不知道如何从控制器中的 calendar 函数调用它们。例如,我尝试过,

<cfset dateList= model("model_file_name").getDateList()>

但事实并非如此。

我应该将查询放在哪里以及如何调用它们?


编辑

当我尝试调用模型中的函数时,我得到“无法访问数据源”。但是,我在查询中明确指定了数据源。例如,我在模型和控制器中都有以下功能:

<cffunction name="getDateList" returntype="any">
    <cfquery name="dateList" dataSource="ELM_Prod">
        SELECT DATES FROM
        (SELECT dateadd(dd,DAYS, <cfqueryparam cfsqltype="cf_sql_date" value="#fromDate#">) DATES
        FROM
        (SELECT TOP 365 colorder - 1 AS DAYS from master..syscolumns
             WHERE id = -519536829 order by colorder) a
        WHERE datediff(
                dd,
                dateadd(
                    dd, DAYS, <cfqueryparam cfsqltype="cf_sql_date" value="#fromDate#">
                    ),
                <cfqueryparam cfsqltype="cf_sql_date" value="#toDate#">
                ) >= 0
        AND  dateadd(
                dd,
                DAYS, 
                <cfqueryparam cfsqltype="cf_sql_date" value="#fromDate#">
                ) <=  <cfqueryparam cfsqltype="cf_sql_date" value="#toDate#">
        ) a order by DATES
    </cfquery>

    <cfreturn dateList>

</cffunction>

当我使用&lt;cfset dateList = getDateList()&gt; 调用控制器中的函数时,一切正常,并且我没有收到数据源错误。但是,如果我使用 &lt;cfset dateList = model("wheels_girs_model").getDateList()/&gt; 从模型中调用它,我会收到错误消息。因为我使用了多个数据源,所以我没有在配置文件中设置数据源。我已经在管理面板中设置了它们,并直接在 cfqeury 中引用它们。什么会阻止模型找到数据源?

【问题讨论】:

  • 存储过程是你的朋友。
  • 存储过程从来都不是我的朋友。 :)

标签: view coldfusion model controller cfwheels


【解决方案1】:


有不同的方法可以做到这一点:

首先,每个控制器 700 行并不算长。

您可以将所有查询放在它自己的控制器中。您可以为不同的查询创建不同的函数(我猜您正在这样做)。

如果您仍然认为这太长了。您可以对不同 cfc 中的功能进行分组。然后您可以使用createObject 创建这些cfc 的对象来访问方法,或者您可以使用cfinvoke 调用cfc 来访问您的函数。
其次,您可以将查询放在模型文件中。您需要在您的模型 cfc 中创建一个函数,然后在此函数中添加您的查询,并且您需要返回查询或特定值,无论您想使用 cfreturn 来做什么
您可以使用

格式调用该函数
<cfset yourVariableName = model("yourModelName").yourCustomFunctionName(arguments if required) />

向您的cfc添加新功能后,您需要使用your_site_url/?reload=true&amp;password=password_you_set重新加载应用程序
第三,正如 Dan Bracuk 所建议的,您可以使用存储过程并使用 cfstoredProc 调用存储过程

编辑回答我从评论中理解的问题
您应该在问题本身中加上错误,因为这会改变一切。此错误与您的代码无关。此错误表示您尚未设置正确的数据源,或者您尚未创建数据源但您正在使用它,或者表示您的数据源配置有问题。
执行以下操作:

  1. 检查是否在 配置/settings.cfm。
  2. 如果不是,请定义它。您可以通过<cfset set(dataSourceName="your_desired_datasource_name.") /> 定义数据源
  3. 如果是,则转到您的 cfadministrator 控制和数据源选项卡。 检查该数据源是否存在。
  4. 如果没有,请创建数据源。如果是,检查是否正确 配置与否,还要检查两者之间的拼写差异 来自 cfadministrator 的数据源名称和在 配置/settings.cfm。

如果您执行上述任一操作,您的问题应该会解决。请记住,无论您做什么,都必须使用 yourappurl/?reload=1&amp;password=password_you_set 重新加载应用程序

第二次编辑
您的问题仍然没有给我们明确的信息,例如您如何在管理面板中设置数据源,然后您如何在查询中访问?这应该是不同的问题,因为这个问题与原始问题完全不同。无论如何,您应该始终使用默认数据源(在 config/settings.cfm 中定义的那个)。您可以在模型 cfc 中覆盖此数据源。您可以通过&lt;cfset dataSource("your datasource name for that particular table")&gt; 覆盖特定模型的默认数据源。请查看link for more info。如果您有更多查询,您应该作为单独的问题(您可能会得到更多回复)。

【讨论】:

  • Tushar -- 在我的问题中我说我已经尝试过&lt;cfset dateList= model("model_file_name").getDateList()&gt;。我收到“无法访问数据源”错误。我正在使用 reload 参数。
  • @abalter,检查答案的编辑部分。由于字符限制,我无法将其发布为评论。
  • 感谢您的澄清。我编辑了我的问题以提供更丰富的信息。请看一看。
  • 嗯,最初的问题是关于为什么我似乎在正确拨打电话时会收到错误消息。但幸运的是,您已经找到了问题的真正根源——数据源设置,而不是函数调用。我一直想知道是否有正确的方法来设置多个数据源。感谢您向我指出那个方向。直到周二才回来工作,但我会尝试实施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2015-04-27
  • 1970-01-01
  • 2022-01-04
  • 2015-09-17
  • 2013-09-14
  • 2011-03-01
相关资源
最近更新 更多