【发布时间】:2023-03-16 19:32:01
【问题描述】:
我有与我的应用程序中的每个帐户相关联的权限记录。每个账户可以根据账户类型拥有一个或多个权限记录。这是一个例子:
<cfquery name="qryUserPerm" datasource="#Application.dsn#">
SELECT AccessType, AccessLevel, State, City, Building
FROM Permissions
WHERE AccountID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(session.AccountID)#">
</cfquery>
上面的查询将为其中一个帐户生成如下数据:
RecID AccountID AccessType AccessLevel State City Building
70 285A637D82B9 F B NY New York 8010
71 285A637D82B9 F B NY New York 5412
73 285A637D82B9 F B NY New York 6103
74 285A637D82B9 F B NY New York 3106
正如您在上面看到的,该帐户分配了 4 条记录。访问类型可以是完整的F 或仅查看V。访问级别可以是州“S”、城市“C”或建筑物“B”。用户当时只能分配一个访问级别,例如,用户无法分配城市和州级别。我的问题是从查询中组织特定访问级别的数据的最佳方法是什么?在这种情况下,我必须合并列表或数组中的 4 条记录。州级只能分配一个权限记录,城市和建筑物可以有多个记录。这是我所拥有的示例:
<cfset local.permissionType = "">
<cfset local.permissionLevel = "">
<cfset local.permissionList = "">
<cfloop query="qryUserPerm">
<cfif qryUserPerm.AccessLevel EQ "S">
<cfset local.permissionType = qryUserPerm.AccessType>
<cfset local.permissionLevel = qryUserPerm.AccessLevel>
<cfset local.permissionList = listAppend(permissionList, "", ",")>
<cfelseif qryUserPerm.AccessLevel EQ "C">
<cfset local.permissionType = qryUserPerm.AccessType>
<cfset local.permissionLevel = qryUserPerm.AccessLevel>
<cfset local.permissionList = listAppend(permissionList, qryUserPerm.City, ",")>
<cfelseif qryUserPerm.AccessLevel EQ "B">
<cfset local.permissionType = qryUserPerm.AccessType>
<cfset local.permissionLevel = qryUserPerm.AccessLevel>
<cfset local.permissionList = listAppend(permissionList, qryUserPerm.Building, ",")>
<cfelse>
<cfset local.permissionType = "">
<cfset local.permissionLevel = "">
<cfset local.permissionList = listAppend(permissionList, "", ",")>
</cfif>
</cfloop>
将permissionType 和permissionLevel 保留在循环内似乎是多余的,但我目前不知道避免这种情况的更好方法。这也使得过程非常困难,以防我必须比较权限列表。如果当前登录的用户更改了他们的权限,我将不得不运行相同的过程并构建列表,以便将其与Session.premissionList 进行比较。有没有办法将这些记录与 SQL 合并?或者这种方法是更好的选择?
【问题讨论】:
-
您如何使用应用程序中的值?回复:“如果当前登录的用户更改了他们的权限”为什么需要比较,而不是仅仅清除旧权限并存储新权限?
-
@Ageax 这也是一个选项。我在想在某些情况下,我必须在运行更新之前比较列表。
-
比较可能在 SQL 中完成,但删除/全部替换更为典型。如果您只返回城市和建筑值,为什么不在 SQL 中这样做呢? (就此而言,您可以在 SQL 中构建列表,尽管 CF 也同样易于使用)。
-
@Ageax 有关如何在 SQL 中实现这一目标的任何示例?
-
@espresso_coffee - 我注意到你的另一个线程在 AccessLevel = "S" 时包含 "State",而这个线程没有。所以我在下面我之前的答案中添加了“状态”。
标签: sql session permissions coldfusion cfloop