2012-01-27 114 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