与Symfony2的Doctrine ORM - 对ManyToMany关系进行排序

时间:2012-01-27 11:39:40

标签: php orm doctrine symfony

我有2个实体。

Mag
Page

具有ManyToMany关系。页面可以附加许多Mags,但我需要允许用户调整Mags的排序顺序。

目前,订单仅基于id表格中的Page_Mag

所以我需要一个排序字段,但是我需要为每个Page-> Mag关系提供一个排序字段,因为有许多页面可以附加任意数量的标记。

我正在努力让我的头脑绕过这样做的最佳方式,而不会使我的架构大量混乱!

有什么想法吗?

我的注释是:

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

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

编辑: 为了更好地解释,这就是关系可能是什么样的,其中mags的顺序很重要:

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

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

2 个答案:

答案 0 :(得分:1)

我不知道您希望如何对Mags进行排序,但您很可能需要MagRepository Class使用DQL(或SQL,如果您愿意)以您想要的顺序获取所需的实体。然后在控制器中使用该存储库。

编辑:

我想我第一次错了你的问题。

不幸的是,在连接表中获取指定Mag中页面位置的字段无法单独使用注释完成。您需要一个连接实体,它与您的Page和Mag实体具有一对多的关联。

答案 1 :(得分:1)

虽然这不是一个直接的答案,但这就是我解决问题的方法。自定义Twig扩展以在视图中执行排序。

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) }}