(这里是轮子新手)
我正在尝试找出放置 View Controller 函数中使用的大量大型和/或复杂查询的最佳位置。
我有一个观点 calendar.cfm
,以及具有以下功能的 Controller :
<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()
, 包含长和/或复杂的查询。 Controller 已经差不多有 700 行了,我只实现了项目中 5 或 6 个 View 中的一个——这将需要额外的查询。
我觉得我做错了。我尝试将所有查询函数放在模型文件夹中的 cfc 文件中
<cfcomponent extends="Model">
functions...
但我不知道如何从 calendar
调用它们 Controller 中的功能。例如,我试过
<cfset dateList= model("model_file_name").getDateList()>
但事实并非如此。
我应该在哪里放置查询以及我应该如何调用它们?
编辑
当我尝试调用模型中的函数时,出现“无法访问数据源”。但是,我在查询中明确指定了数据源。例如,我在模型和 Controller 中都有以下功能:
<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()>
调用 Controller 中的函数时,一切都很好,我没有收到数据源错误。但是,如果我用 <cfset dateList = model("wheels_girs_model").getDateList()/>
从模型中调用它,我得到了错误。因为我使用了多个数据源,所以我没有在配置文件中设置数据源。我已经在管理面板中设置了它们,并直接在 cfqeury 中引用它们。什么会阻止模型找到数据源?
最佳答案
有不同的方法可以做到这一点:
首先,每个 Controller 700行并不算长。
您可以将所有查询放在它自己的 Controller 中。您可以为不同的查询创建不同的函数(我猜您正在这样做)。
如果你还觉得这太长了。您可以在不同的 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
重新加载应用程序
第三,正如 Dan Bracuk 所建议的,您可以使用存储过程并使用 cfstoredProc
调用存储过程。
编辑 回答我从评论中理解的问题
您应该在问题本身中输入错误,因为这会改变一切。此错误与您的代码无关。这个错误意味着你没有设置正确的数据源或者你没有创建数据源但是你正在使用它或者它意味着你的数据源配置有问题。
执行以下操作:
- 检查你是否定义了正确的数据源 配置/设置.cfm.
- 如果不是,请定义它。您可以通过
<cfset set(dataSourceName="your_desired_datasource_name.") />
定义数据源 - 如果是,则转到您的 cfadministrator 控件和数据源选项卡。 检查该数据源是否存在。
- 如果没有,创建数据源。如果是,检查是否正确 配置与否,还要检查拼写差异 来自 cfadministrator 的数据源名称和在 配置/设置.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 .如果您有更多疑问,您应该作为单独的问题(您可能会得到更多回复)。
关于view - 在 CFWheels 项目中放置查询(尤其是长查询)的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27557546/