0

我在对多对多关系进行排序时遇到了问题。我想要实现的目标似乎应该相当简单,但是在我多次与 Fuel 碰撞之后,我仍然无法让它发挥作用。

(顺便说一句,我意识到之前或多或少有人问过这个问题,但是因为(a)当时不可能对延迟加载关系进行排序,并且(b)我有更多我遇到的确切问题的详细信息,我认为值得作为一个单独的问题提出......)

这是我遇到的问题:

我有一个“项目”模型。项目可以有孩子(也是项目),通过“items_items”表与“parent_id”和“child_id”列通过多对多关系连接。“items_items”表还有一个“sortorder”列,可以设置子项的顺序。

为这种关系创建一个单独的模型对我来说似乎有点矫枉过正,所以当父项被保存时(通过 Model_Item 上的“_event_after_save”方法),观察者会更新顺序,该观察者会更新子项的排序顺序。这似乎工作正常。

但是,我遇到的问题是我可以使用延迟加载急切加载来获得排序顺序,但不能同时使用两者。无论哪一个有效,另一个都会引发 Fuel 错误,因此目前让渴望加载和延迟加载都起作用的唯一方法是在渴望加载时废弃 'order_by' 子句。以下是我尝试定义“孩子”关系的三种方式:

方法#1

  • 这是FuelPHP 文档中相关页面建议的方法。
  • 急切或延迟加载没有错误,但无论哪种方式,order_by 都不受尊重(子项按 id 排序,而不是按 sortorder)

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

方法#2

  • 使用急切加载按需工作
  • 延迟加载导致燃料错误( “未找到列:1054 Unknown column 'items_items.sortorder' in 'order Clause'”)这似乎是因为 items_items 在 JOIN 子句中别名为 't0_through',但在 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

  • 根据需要使用延迟加载
  • 急切加载导致燃料错误(实际上与上面的第 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'
            ),
        )
    )
    

在一个有点绝望的hack中,我尝试通过定义两个单独的关系('children'和'child')来组合上面的方法2和3 - 一个用于急切加载,另一个用于延迟加载,但它仍然会破坏我的应用程序,因为它使删除过程会引发类似的错误。我可以尝试解决这个问题,但我觉得那只会是一堆黑客攻击。相反,我想要的是一种可靠的订购子项目的方法,无论它们是渴望加载还是延迟加载。Fuel的文档建议这应该是可行的(方法#1,上面),但我就是无法让它工作......

任何帮助将不胜感激!

4

2 回答 2

2

从 ORM 的角度来看,“through_table”不存在。它只是被定义为可以构造使关系工作所需的 SQL。这也意味着不支持“through_table”中的附加字段,它只能包含键值。

如果您想要通过表中的属性(附加列),它将成为数据库中的标准表,需要模型。然后,您的多对多关系分解为两个一对多关系。

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

于 2014-12-12T21:13:21.277 回答
0

我终于设法解决了这个问题。事实证明,当前版本的 Fuel 的 ORM(1.7 版)存在问题。

对我有用的是将 ORM 更新到更新的开发版本( ORM 的 1.8/develop 分支上的60cc4eb576),然后在多对多关系上设置“order_by”,如下所示:

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

这是上述方法 2 和 3 的组合,与文档当前建议的语法不完全一致,但对于急切加载和延迟加载似乎都按预期/期望的方式工作。

于 2015-04-10T15:58:20.720 回答