CF ORM порядок сортировки отношений "многие ко многим"

У меня есть много-много настроек отношений, и мне нужно контролировать порядок.

У меня есть объект со свойством ниже. Как я могу контролировать порядок компонентов при получении через это отношение?

property name="Components" fieldtype="many-to-many" cfc="CmsComponent" 
      type="array" 
      singularname="Component" 
      linktable="CMSPageComponents" 
      fkcolumn="page_id" 
      inversejoincolumn="component_id";

Я установил столбец в linktable (CMSPageComponents) под названием dispOrder, Но когда я установил orderby="dispOrder" или же orderby="CMSPageComponents.dispOrder" Атрибут на свойство выше, просто кажется, игнорировать его.

Любые предложения о том, как я могу контролировать порядок отношений многих ко многим?

1 ответ

Решение

Когда отношение "многие ко многим" будет применяться orderBy оператор для таблицы объектов, а не для таблицы ссылок. Таким образом, теоретически вы можете переместить столбец dispOrder из таблицы ссылок CMSPageComponents в таблицу CmsComponent, чтобы он работал.

Но на практике я ожидаю, что упорядочение зависит от отношения "многие ко многим" (то есть конкретной страницы), и в этом случае вы можете последовать совету Питера и создать отдельную сущность, которая связывает две другие сущности и позволяет вам определить свойство порядка,

Таким образом, у вас будет 3 объекта:

  1. CmsPage
  2. CmsComponent
  3. 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

Другие вопросы по тегам