在博客帖子页面上,我将Title,Body和UserID(作者表中的外键)添加到我的BlogPost表中:
<!--- Query to Insert Blog --->
<cfquery Result="blogEntry" datasource="prpblog">
INSERT INTO BlogPosts (Title, BlogBody, UserID)
VALUES
(
<cfqueryparam value='#Form.Title#' cfsqltype="cf_sql_varchar"/>,
<cfqueryparam value='#Form.BlogBody#' cfsqltype="cf_sql_varchar"/>,
<cfqueryparam value='#Form.SelectAuthor#' cfsqltype="cf_sql_numeric"/>
)
</cfquery>
然后我想将博客所包含的标签添加到Junction表中(因为属于多个博客/博客的多个标签所引起的多对多关系)
我知道如何将标记插入到联结表中,但是如何将我的blogID插入此表?输入新博客时,BlogID是自动编号。
Junction Table列示例:
BlogID TagID
10 1
10 10
10 13
9 10
9 1
<Select name="SelectTag" multiple="multiple" size="6">
<cfoutput QUERY="Tags"><option value="#TagID#">#Tag#</option></cfoutput>
</select>
<cfquery name="AddTag" datasource="prpblog">
INSERT INTO BlogTagJunction (TagID)
VALUES
(
<cfqueryparam value='#Form.???' cfsqltype="cf_sql_numeric"/>
<cfqueryparam value='#Form.SelectTag#' cfsqltype="cf_sql_numeric"/>
)
</cfquery>
答案 0 :(得分:2)
我自己通过在后面创建一个查询语句来解决问题 插入从博客I抓取博客ID的博客的声明 刚刚创建:
仅当Title
列上有唯一索引时才会有效。但是,您可能甚至不需要单独的查询。如果BlogID
是某种自动递增列(标识,自动增量,...),请使用result
attribute of cfquery从您的第一个INSERT
语句中检索生成的ID值。确切的语法是db dependent。
鉴于TagID
的源是另一个数据库表,跳过循环并使用INSERT/SELECT
在单个语句中生成联结表记录更简单。您没有说明您的DBMS,但是对于SQL Server这样的东西。根据需要更改“cfsqltypes”:
<!--- create the blog entry --->
<cfquery result="blogEntry" ....>
INSERT INTO BlogPost ( Title, Body, UserID )
VALUES
(
... the values here ....
)
</cfquery>
<!--- associate the new blog entry with the selected tag id's --->
<cfquery ....>
INSERT INTO BlogTagJunction (BlogID, TagID)
SELECT <cfqueryparam value="#blogEntry.IDENTITYCOL#"
cfsqltype="cf_sql_integer">
, TagID
FROM YourTagTable
WHERE TagID IN
(
<cfqueryparam value="#Form.SelectTag#"
list="true"
cfsqltype="cf_sql_numeric"/>
)
</cfquery>
注意:请务必在cftransaction
中包装两个查询以确保数据完整性。
从评论中更新:
如果您使用的是MS Access,则表示使用result
属性。 CFQuery不支持MS Access的该功能。因此,您需要使用另一种方法来获取新创建的ID。
正如this link 中所讨论的,有几种方法可以做到这一点。其中之一是在表中添加UUID列。 MS Access的另一个选项是使用@@identity变量。将记录插入带有“自动编号”列的表后,@@ identity值将包含新记录的ID。 This blog contains an example。注意:正如我在你的其他帖子中所提到的,你必须在cftransaction中附上两个查询,否则它将无法正常工作。
总之,你需要做三件事:
INSERT
BlogPost
表BlogTagJunction
醇>
同样,使用MS Access,您无法跳过此处的cftransaction
,否则无法使用。把它们放在一起:
<cftransaction>
<!--- create the blog record --->
<cfquery result="blogEntry" ....>
INSERT INTO BlogPost ( Title, Body, UserID )
VALUES
(
... the values here ....
)
</cfquery>
<!--- get the ID of the record you just inserted --->
<cfquery name="getNewRecord">
SELECT @@identity AS TheNewID
</cfquery>
<!--- Use that new ID to associate blog and selected tag id's --->
<cfquery ....>
INSERT INTO BlogTagJunction (BlogID, TagID)
SELECT <cfqueryparam value="#getNewRecord.TheNewID#"
cfsqltype="cf_sql_integer">
, TagID
FROM YourTagTable
WHERE TagID IN
(
<cfqueryparam value="#Form.SelectTag#"
list="true"
cfsqltype="cf_sql_numeric"/>
)
</cfquery>
</cftransaction>
答案 1 :(得分:0)
我自己通过在博客的insert语句之后创建一个查询语句来解决问题,该博客从我刚创建的博客中获取博客ID:
<CFQUERY name="BlogID" datasource="blog">
SELECT BlogID
FROM BlogPosts
WHERE Title = '#Form.Title#'
</CFQUERY>
然后我执行CFoutput输出查询的BlogID值。