View 在CFWheels项目中将查询(特别是长查询)放在何处

View 在CFWheels项目中将查询(特别是长查询)放在何处,view,coldfusion,model,controller,cfwheels,View,Coldfusion,Model,Controller,Cfwheels,我是新手 我试图找出放置视图的控制器函数中使用的大量大型和/或复杂查询的最佳位置 我有一个view calendar.cfm和一个具有以下功能的控制器: <cffunction name="calendar"> <cfset formData = getValidatedFormData()> <cfset fromDate = formData.fromDate> <cfset toDate = formData.toDate

我是新手

我试图找出放置视图的控制器函数中使用的大量大型和/或复杂查询的最佳位置

我有一个view 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>
但我不知道如何从控制器中的日历函数调用它们。我试过,比如

<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>
当我用调用控制器中的函数时,一切正常,并且我没有得到数据源错误。但是,如果我从带有的模型调用它,就会得到错误。因为我使用多个数据源,所以我没有在配置文件中设置数据源。我在管理面板中设置了它们,并在cfqeury中直接引用它们。什么会阻止模型找到数据源

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

首先,每个控制器700行不是太长

您可以将所有查询放在控制器中,并自行执行。您可以为不同的查询创建不同的函数,我想您正在这样做

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

在向cfc添加新功能后,您需要使用您设置的\u站点\u url/?reload=true&password=password\u重新加载应用程序 第三,正如Dan Bracuk所建议的,您可以使用存储过程并使用cfstoredProc调用存储过程

编辑我从评论中理解的问题的答案 你应该在问题本身中加入错误,因为这会改变一切。此错误与您的代码无关。此错误意味着您没有设置正确的数据源,或者您没有创建数据源,但您正在使用它,或者意味着您的数据源配置中存在错误。 请按以下步骤操作:

检查是否在中定义了正确的数据源 config/settings.cfm。 如果没有,请定义它。您可以通过以下方式定义数据源: 如果是,则转到您的cfadministrator控件和数据源选项卡。 检查该数据源是否存在。 如果不是,则创建数据源。如果是,请检查是否正确 无论是否配置,也要检查 cfadministrator中的数据源名称和 config/settings.cfm。 如果您执行上述操作之一,您的问题就会消失。记住,无论您做什么,都必须使用AppURL/?reload=1&password=password\u设置重新加载应用程序

第二次编辑:
您的问题仍然没有给我们提供明确的信息,例如如何在管理面板中设置datasource,然后如何在查询中访问?这应该是另一个问题,因为这个问题与原来的问题完全不同。无论如何,您应该始终使用config/settings.cfm中定义的默认数据源。您可以在模型cfc中重写此数据源。您可以通过以下方式覆盖特定模型的默认数据源。请检查一下电话号码。如果你有更多的疑问,你应该把它作为一个单独的问题,你可能会得到更多的回答

存储过程是你的朋友。存储过程从来都不是我的朋友图萨-在我的问题中,我说我已经试过了。我收到一个无法访问数据源的错误消息。我正在使用重新加载参数。@abalter,检查答案的编辑部分。由于角色限制,我无法将其作为评论发布。感谢您的澄清。我编辑了我的问题以提供更丰富的信息。请看一看。原来的问题是,为什么我在打对电话的时候会出错。但谢天谢地,您已经找到了问题的真正根源—数据源设置,而不是函数调用。我一直在想是否有一种合适的方法来设置多个数据源。谢谢你给我指出那个方向。星期二之前我不会回去工作,但到时候我会试试这个实现。
<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>
<cfset yourVariableName = model("yourModelName").yourCustomFunctionName(arguments if required) />