4

誰かがこの問題に直面したことがあるかどうか疑問に思っています。
製品とカート (多対多に関連) という 2 つのテーブルがあるとします。

現在、結合テーブルには追加の列があります - 金額 (カートにある特定のタイプの製品の数)。


私の問題は、次の関係を介して「金額」列にアクセスできないことです。

パブリック関数関係()
{       
    配列を返します(
           'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'),

    );
}

私も試しました:

'products'=>array(self::HAS_MANY, 'Product','product_id','through'=>'cart_products'),

運がない。

4

1 に答える 1

14

YiiのMANY_MANY実装には制限があり、それは後のYiiバージョンで対処される可能性があります。

これに対する解決策は、MANY_MANYテーブルにもう1つのモデルクラスを使用することです。たとえば、ARクラスCartProductを作成すると、カートのリレーションは次のようになります。

public function relations()
{       
    return array(
           'cartProducts'=>array(self::HAS_MANY, 'CartProduct', 'cart_id'),
           'products'=>array(self::HAS_MANY, 'Product', 'product_id', 'through' => 'CartProduct'),
    );
}

このようにして、CartインスタンスのcartProductsマジックパブリックプロパティでCartProductsモデルを参照し、「金額」を更新できるようになります。

問題へのアプローチが気に入らないと言うのは良い時期です。カート内の製品の数を保持する「量」列があるのは、2つの真実(マップされている製品の実際の量)を保持する必要があるためです。このdbの非正規化を必要とする非常に重いアプリケーションがない限り、製品数を取得するために、代わりに「カウンター関係」を実行します。このように、その値を列にキャッシュします(カートモデルに次の関係を追加します)。

public function relations()
{       
    return array(
           'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'),
           'productsAmount'=>array(self::STAT, 'Product', 'cart_products(cart_id, product_id)'),

    );
}

このように、cart-> protuctsAmountプロパティを呼び出すことができ、コードまたはによって再生成する必要があるキャッシュされた値に依存する代わりに、単純で高速なカウントクエリ(キャッシュされると思います)で実際の量を返しますカート製品を変更するたびにdbがトリガーされます。

于 2011-07-26T08:45:46.837 に答える