【问题标题】:Doctrine ORM with Symfony2 - Sorting a ManyToMany relationship使用 Symfony2 的 Doctrine ORM - 对多对多关系进行排序
【发布时间】:2012-02-20 09:50:28
【问题描述】:

我有 2 个实体。

Mag
Page

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

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

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

我正在努力寻找最好的方法来做到这一点,而不会把我的架构弄得一团糟!

有什么想法吗?

我的注释是:

  /**
    * @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

等等

【问题讨论】:

    标签: php orm doctrine symfony


    【解决方案1】:

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

    编辑:

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

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

    【讨论】:

    • 谢谢。这是有道理的,但我需要知道如何将排序字段添加到我认为的 ManyToMany 中?所以我的订单可能是 Mag_id=1 、 Mag_id=4 、 Mag_id=2 等。编辑:刚刚看到你的编辑! :)
    • 您只是想对杂志或杂志内的页面进行排序,还是两者兼而有之?如果是杂志,那么只有杂志需要排序字段。如果是杂志内的页面,请使用连接实体。
    • 令人困惑的是,通过 Pages ,我不是在谈论“杂志”页面,而是在谈论“Web”页面。所以 Page 是主要实体,它有很多 'Magazines' ,但每个 'Magazine' 可以在很多 'Pages\ :)
    • 好的,但是您仍然可以使用连接表/实体上的排序字段来解决这个问题,因为排序可能只是一种方式。如果没有,请添加两个排序字段。一个用于 page -> mag,一个用于 mag -> page。
    • 我放弃了尝试让实体来处理我的排序,而是实现了一个自定义的 Twig 扩展来为我执行排序。不过感谢您的帮助。
    【解决方案2】:

    虽然这不是一个真正的直接答案,但这就是我解决问题的方法。自定义 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) }}
    

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 2014-09-14
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多