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'),
);
}
この道を、あなたはカート・インスタンスのcartProducts魔法のパブリックプロパティにCartProductsモデルへの参照を持っていますし、あなたの "を更新することができるようになります量"。
私は、問題へのあなたのアプローチが気に入らないと言っています。カート内の製品の数を保持する「量」列を持つことは、2つの真理(実際のdb内のカートにマップされている商品と、関連するテーブルのカウンタキャッシュの「金額」フィールド)。この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トリガーによって再生成されなければならないキャッシュされた値に頼るのではなく、迅速かつ正確に(キャッシュされる)
本当にありがとうございました。私が望んでいたようなものです。私が取り組んでいるショップでは、製品のサイズや色などの魅力的な機能は必要ありません(私はこれらの製品のうちの5つ、そのうちの3つが必要です)。 "私はあなたのアプローチを理解していますが、プロジェクトが大きくなる可能性がある場合は、私は間違いなくそれを使用します。 – mailo
OPの状況を改善してくれてありがとうございますが、彼の質問にも答えています。同様の状況に遭遇し、あなたが提供した答えを持っていることが非常に役に立ちます。 – Navarr