2014-12-18 43 views
3

(车轮新手在这里)放在哪里查询(尤其是长的)在CFWheels项目

我试图找出最好的地方放一些被用于大型和/或复杂的查询控制器可用于视图。

我有一个视图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> 

当我调用该函数在控制器<cfset dateList = getDateList()>,一切都很好,我没有得到的数据源错误。但是,如果我使用<cfset dateList = model("wheels_girs_model").getDateList()/>从模型中调用它,则会出现错误。由于我使用多个数据源,因此我没有在配置文件中设置数据源。我已经在管理面板中设置了它们,并直接在cfqeury中引用它们。什么会阻止模型找到数据源?

+0

存储过程是你的朋友。 – 2014-12-19 02:53:36

+1

存储过程从未成为我的朋友。 :) – 2014-12-19 19:56:52

回答

3


有不同的方式来做到这一点:

首先,每个控制器700线不能太长。

您可以将所有查询放入控制器中。你可以为不同的查询创建不同的功能(我猜你正在这样做)。

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

<cfset yourVariableName = model("yourModelName").yourCustomFunctionName(arguments if required) /> 

添加新的功能,以您的CFC后,您需要使用your_site_url/?reload=true&password=password_you_set
三,丹Bracuk建议,您可以使用存储过程和呼叫重新加载应用程序使用cfstoredProc

编辑存储过程回答我从评论
理解的问题,您应该把错误的问题本身作为这改变了一切。这个错误与你的代码无关。这个错误意味着你没有设置正确的数据源,或者你还没有创建数据源,但是你正在使用它,这意味着你的数据源配置有问题。
做如下所示:

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

如果您执行上述操作之一,则应解决问题。请记住,不管你做什么,你必须使用yourappurl/?reload=1&password=password_you_set

第二个编辑重新加载应用程序:
你的问题仍然没有给我们像你如何管理面板设置数据源,然后你怎么获得明确信息查询?这应该是不同的问题,因为这个问题与原始问题完全不同。无论如何,您应该始终使用默认数据源(在config/settings.cfm中定义的数据源)。您可以在模型cfc中覆盖此数据源。您可以通过<cfset dataSource("your datasource name for that particular table")>覆盖特定型号的默认数据源。请检查link for more info。如果你有更多的疑问,你应该作为单独的问题(你可能会得到更多的答复)。

+0

Tushar - 在我的问题中,我说我已经尝试过''。我收到“数据源无法访问”错误。我正在使用重载参数。 – abalter 2014-12-23 14:16:45

+0

@abalter,检查编辑部分的答案。由于字符限制,我无法将其作为评论发布。 – 2014-12-23 15:38:36

+0

感谢您的澄清。我编辑了我的问题以提供更丰富的信息。请看一下。 – abalter 2014-12-23 21:15:43