多対多の関係での並べ替えに問題があります。私が達成しようとしていることはかなり単純なように思えますが、Fuel に何度も頭をぶつけた後でも、まだ機能させることができません。
(ちなみに、この質問は以前にも多かれ少なかれ聞かれたことがあると思いますが、(a) 当時は遅延読み込み関係を分類することができなかったので、(b) もっと多くのことを手に入れました私が抱えている正確な問題の詳細、別の質問として尋ねる価値があると思いました...)
私が抱えている問題は次のとおりです。
「アイテム」モデルがあります。アイテムは、'parent_id' および 'child_id' 列を持つ "items_items" テーブルを介して多対多の関係を介して結合された子 (アイテムでもあります) を持つことができます。「items_items」テーブルには「sortorder」列もあり、子アイテムの順序を設定できます。
この関係のために別のモデルを作成するのはやり過ぎのように思えたので、親が保存されたときに子アイテムのソート順を更新するオブザーバーによって順序が更新されます (Model_Item の「_event_after_save」メソッドを介して)。これはうまくいくようです。
ただし、私が抱えている問題は、並べ替え順序を遅延読み込みまたは積極的読み込みのいずれかで動作させることができますが、両方では動作しないことです。どちらが機能しても、もう一方は Fuel エラーをスローするため、現時点で熱心な読み込みと遅延読み込みの両方を機能させる唯一の方法は、熱心な読み込み時に「order_by」句を削除することです。「子」関係を定義するために私が試した 3 つの方法を次に示します。
アプローチ #1
- これは、 FuelPHP のドキュメントの関連ページが推奨するアプローチです。
熱心な読み込みでも遅延読み込みでもエラーはありませんが、いずれにしても order_by は尊重されません (子アイテムはソート順ではなく ID で並べ替えられます)
'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
- イーガーローディングで思い通りに動作
遅延読み込みで Fuel エラーが発生します ( 「Column not found: 1054 Unknown column 'items_items.sortorder' in 'order clause'」 ) これは、JOIN 句で items_items が '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' ), ) )
少し絶望的なハックで、2つの別々の関係(「子」と「子」)を定義することにより、上記のアプローチ2と3を組み合わせてみました-1つは熱心な読み込み用、もう1つは遅延読み込み用ですが、それでもアプリが壊れます。削除プロセスは同様のエラーをスローします。これを修正しようとすることはできますが、それはハックにハックを重ねるだけのように感じます。代わりに私が望むのは、子アイテムが熱心にロードされたか遅延ロードされたかに関係なく機能する、子アイテムを注文する確実な方法です。Fuel のドキュメントは、これが実行可能であることを示唆しています (上記のアプローチ #1) が、私はそれを機能させることができません...
どんな助けでも大歓迎です!