我在对多对多关系进行排序时遇到了问题。我想要实现的目标似乎应该相当简单,但是在我多次与 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,上面),但我就是无法让它工作......
任何帮助将不胜感激!