2012-01-27 116 views
1

我有2個實體。與Symfony2的Doctrine ORM - 排序ManyToMany關係

Mag 
Page 

其中有ManyToMany關係。一個頁面可以附加許多Mags,但我需要允許用戶調整Mags的排序順序。

目前,訂單正是基於這本雜誌的idPage_Mag

所以我需要一個排序字段,後來我就需要爲每個頁面 - >馬格關係的排序字段,因爲有很多頁面可以附加任意數量的Mags。

我很努力地讓我的頭在這樣做的最佳方式,而不會大量混亂我的模式!

任何想法?

我的註解是:

/** 
    * @ORM\ManyToMany(targetEntity="Page", mappedBy="magazines" , cascade = {"persist", "remove"}) 
    */ 
    protected $Page; 

/** 
* @ORM\ManyToMany(targetEntity="Magazine", inversedBy="id" , cascade = {"persist", "remove"}) 
*/ 
protected $magazines; 

編輯: 要嘗試和更好的解釋,這是關係可能是什麼樣的,這裏的彈匣的順序是重要的保持:

Page_id 1 -> Mag_id:4 
      -> Mag_id:2 
      -> Mag_id:1 

Page_id 2 -> Mag_id:12 
      -> Mag_id:1 
      -> Mag_id:4 

回答

1

雖然這不是一個真正的直接答案,但這是我解決問題的方法。自定義樹枝擴展在視圖中執行排序。

public static function magorder($magazines , $order) 
{ 
    $newMagazines = array(); 
    $order = explode(',', $order); 

    foreach ($magazines as $magazine) 
    { 
     $newMagazines[array_search($magazine->getId(), $order)] = $magazine; 
    } 

    return $newMagazines; 
} 

然後這被稱爲for內:

{{ page.magazines|magorder(page.magorder) }} 
1

我不知道你想如何排序你的Mags,但你最有可能需要一個MagRepository Class使用DQL(或SQL,如果你喜歡)以你想要的順序獲取你想要的實體。然後在控制器中使用該存儲庫。

編輯:

我想我第一次得到你的問題是錯的。

不幸的是,在連接表中獲取指定頁面在Mag中位置的字段不能單獨使用註釋完成。您需要一個與您的Page和Mag實體具有一對多關聯的連接實體。

+0

感謝。這是有道理的,但我需要知道如何將排序字段添加到我認爲的ManyToMany?所以我的訂單可能是Mag_id = 1,Mag_id = 4,Mag_id = 2等編輯:只看到你的編輯! :) – BobFlemming 2012-01-27 12:01:49

+0

你只是想排列mags或頁面內mag或兩者?如果它是雜誌,那麼只有雜誌需要一個分類領域。如果它是mag中的頁面,則使用join實體。 – maiwald 2012-01-27 12:04:11

+0

令人困惑的是,通過Pages,我不是在談論'雜誌'頁面,而是在談論'網頁'。所以Page是主要的實體,它有許多'雜誌',但每個'雜誌'可以在許多'Pages \ :) – BobFlemming 2012-01-27 12:10:47