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がトリガーされます。