0

多対多の関係での並べ替えに問題があります。私が達成しようとしていることはかなり単純なように思えますが、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) が、私はそれを機能させることができません...

どんな助けでも大歓迎です!

4

2 に答える 2

2

ORM の観点からは、「through_table」は存在しません。関係を機能させるために必要な SQL を構築できるように定義されているだけです。つまり、「through_table」の追加フィールドはサポートされておらず、キー値のみを含めることができます。

スルー テーブルに属性 (追加の列) が必要な場合は、モデルが必要なデータベースの標準テーブルになります。多対多の関係は、2 つの一対多の関係に分割されます。

両方が同時に存在できることに注意してください。したがって、スルー テーブルで列をクエリまたは使用する必要がない場合でも、多対多を使用できます。

于 2014-12-12T21:13:21.277 に答える