當關系是多對多時,CF將把orderBy
語句應用於對象表而不是鏈接表。因此,在理論上則可以將dispOrder列從CMSPageComponents移動鏈接表到CmsComponent表,使其工作。
但實際上,我期望排序是特定於多對多關係(即特定頁面),在這種情況下,您可以遵循彼得的建議並創建一個單獨的實體,鏈接其他兩個實體並讓您定義一個訂單屬性。
所以,你將有3個實體:
- CmsPage
- CmsComponent
- CmsPageComponent
CmsPageComponent可能是這個樣子:
<cfcomponent displayname="CmsPageComponent" persistent="true" table="cmsPageComponents">
<!--- Add a primary key for the link Entity --->
<cfproperty name="ID" fieldType="id" generator="native">
<cfproperty name="dispOrder">
<cfproperty name="page" fieldType="many-to-one" cfc="CmsPage" fkColumn="pageID">
<cfproperty name="component" fieldType="many-to-one" cfc="CmsComponent" fkColumn="componentID">
<!--- init() etc --->
</cfcomponent>
CmsPage然後可以與使用dispOrder列中的鏈接實體允許訂購一個一對多的關係:
<cfcomponent displayname="CmsPage" persistent="true" table="cmsPages">
<cfproperty name="ID" fieldType="id" generator="native">
<cfproperty name="pageComponents" singularName="pageComponent" fieldType="one-to-many" cfc="PageComponent" fkColumn="pageID" orderBy="dispOrder">
<!--- init() etc --->
</cfcomponent>
更新 以下說明了如何添加和顯示頁面組件。不是唯一的或必然最好的辦法,但只給你一個想法:
<cfscript>
transaction{
//load the page
page = EntityLoadByPK("CmsPage",1);
//load the components we want to add
component1 = EntityLoadByPK("CmsComponent",1);
component2 = EntityLoadByPK("CmsComponent",2);
//create link objects
pageComponent1 = EntityNew("CmsPageComponent");
pageComponent2 = EntityNew("CmsPageComponent");
// link them to the pages and components in the order we want
pageComponent1.setComponent(component1);
pageComponent1.setPage(page);
pageComponent1.setDispOrder(2);
EntitySave(pageComponent1);
pageComponent2.setComponent(component2);
pageComponent2.setPage(page);
pageComponent2.setDispOrder(1);
EntitySave(pageComponent2);
}
//Reload from the database so the order is applied
EntityReload(page);
</cfscript>
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<cfoutput>
<h2>Page #page.getID()#</h2>
<ol>
<cfloop array="#page.getPageComponents()#" index="pageComponent">
<cfset component = pageComponent.getComponent()>
<li>Component ID #component.getID()#, Display Order = #pageComponent.getDispOrder()#)</li>
</cfloop>
</ol>
</cfoutput>
</body>
</html>
注:這是假定的ORM設置flushAtRequestEnd
是真正的Application.cfc
據我所知很多一對多其實並不是太應用廣泛而且相當有限。嘗試將其轉換爲一對多,排序順序應該得到很好的支持。 – Henry
是的,一對多確實很容易排序,但我需要多對多。一對多隻是不能提供我需要的功能。 – Jason
什麼功能?多對多基本上只是一對一對多的關係。如果你想在鏈接表上使用order by,那麼afaik將它提升爲一個實體就是你需要做的事情。 –