2014-12-18 44 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