Orm 使用FuelPHP按多对多关系排序

Orm 使用FuelPHP按多对多关系排序,orm,lazy-loading,eager-loading,fuelphp,fuelphp-orm,Orm,Lazy Loading,Eager Loading,Fuelphp,Fuelphp Orm,我对多对多关系的排序有问题。我试图实现的似乎应该是相当简单的,但在我的头撞了很多燃料之后,我仍然无法让它工作 (顺便说一句,我或多或少意识到这个问题已经存在,但是由于(a)当时不可能对延迟加载关系进行排序,并且(b)我已经得到了关于我所遇到的确切问题的更多细节,我认为值得作为一个单独的问题来问……) 我的问题是: 我有一个“项目”模型。项可以有子项(也可以是项),通过一个具有“父项id”和“子项id”列的“项项项”表通过多对多关系连接。“items\u items”表还有一个“sortorder

我对多对多关系的排序有问题。我试图实现的似乎应该是相当简单的,但在我的头撞了很多燃料之后,我仍然无法让它工作

(顺便说一句,我或多或少意识到这个问题已经存在,但是由于(a)当时不可能对延迟加载关系进行排序,并且(b)我已经得到了关于我所遇到的确切问题的更多细节,我认为值得作为一个单独的问题来问……)

我的问题是:

我有一个“项目”模型。项可以有子项(也可以是项),通过一个具有“父项id”和“子项id”列的“项项项”表通过多对多关系连接。“items\u items”表还有一个“sortorder”列,以便可以设置子项的顺序

对我来说,为这种关系创建一个单独的模型似乎有些过分,因此,在保存父项时(通过模型项上的“\u event\u after\u save”方法),观察者会更新子项的排序规则,从而更新顺序。这似乎很有效

然而,我遇到的问题是,我可以使用延迟加载或快速加载获得排序顺序,但不能同时使用两者。无论哪一个有效,另一个都会抛出燃料错误,因此当前让渴望和延迟加载都有效的唯一方法是在渴望加载时废弃“order_by”子句。以下是我尝试过的三种定义“儿童”关系的方法:

方法#1

  • 这是政府建议应该采取的办法
  • 在即时或延迟加载上没有错误,但无论哪种方式,order_by都不受尊重(子项按id排序,而不是按排序器排序)

方法#2

  • 可根据需要快速加载
  • 导致延迟加载时出现燃油错误(“未找到列:'order子句'中的1054未知列'items\u items.sortorder')) 这似乎是因为items\u items在JOIN子句中别名为“t0\u至”,但在ORDER BY子句中没有

    'children' => array(
        'table_through'    => 'items_items',
        'key_through_from' => 'parent_id',
        'key_through_to'   => 'child_id',
        'model_to'         => 'Model_Item',
        'conditions'            => array(
            'order_by' => array(
                'items_items.sortorder' => 'ASC'
            ),
        )
    )
    
方法#3

  • 根据需要使用延迟加载
  • 因急装导致燃油错误(实际上与上述take#2相反)

在一次有点绝望的攻击中,我尝试通过定义两个独立的关系(“children”和“child”)将上述方法2和3结合起来——一个用于急切加载,另一个用于惰性加载,但它仍然会破坏我的应用程序,因为它会使删除过程抛出类似的错误。我可以尝试修复这个问题,但我觉得那只是一个接一个的攻击。相反,我想要的是一种可靠的方式来订购子项,无论它们是急切的还是懒散的。Fuel的文件建议这应该是可行的(方法1,上面),但我就是不能让它起作用


任何帮助都将不胜感激

从ORM的角度来看,“直通表”并不存在。它的定义只是为了能够构造使关系工作所需的SQL。这也意味着“through_表”中的其他字段不受支持,它只能包含键值

如果希望在直通表中包含属性(附加列),则它将成为数据库中的标准表,需要模型。然后,你的多2多关系分解为两个一2多关系


请注意,两者可以同时存在,因此如果不需要查询或使用直通表中的列,您仍然可以使用多对多。

我终于解决了这个问题。这原来是Fuel的ORM(版本1.7)当前版本的一个问题

对我来说,有效的方法是将ORM更新到最新的开发版本(在ORM的1.8/developer分支上),然后在多对多关系上设置“order_by”,如下所示:

...
'conditions' => array(
    'order_by' => array(
        'items_items.sortorder' => 'ASC'
    ),
)
...

这是上述方法2和3的组合,并不完全符合当前建议的语法,但对于快速加载和延迟加载,似乎都能按预期/期望工作。

哦,值得一提的是,我使用的是当前稳定版本的FuelPHP(1.7.2),但这太糟糕了,没有报告,因此我们可以修复文档。现在完成。;-)@魔法师:事实上,我确实报告了!看见
'children' => array(
    'table_through'    => 'items_items',
    'key_through_from' => 'parent_id',
    'key_through_to'   => 'child_id',
    'model_to'         => 'Model_Item',
    'conditions'            => array(
        'order_by' => array(
            't0_through.sortorder' => 'ASC'
        ),
    )
)
...
'conditions' => array(
    'order_by' => array(
        'items_items.sortorder' => 'ASC'
    ),
)
...