2011-07-26 7 views
4

誰もがこの問題に直面しているのだろうかと思います。
私は2つのテーブルを持っていると仮定しましょう:製品とカート(多くのものか​​ら多くのものに関連するもの)。

ここで、結合テーブルには追加の列数(カート内にある特定のタイプの商品の数)があります。私も試してみました多対多、別の列で

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

    ); 
} 


私の問題は、私は次のような関係を経由して "量" の欄にアクセスすることができないということである運と

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

答えて

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'), 
    ); 
} 

この道を、あなたはカート・インスタンスの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トリガーによって再生成されなければならないキャッシュされた値に頼るのではなく、迅速かつ正確に(キャッシュされる)

+0

本当にありがとうございました。私が望んでいたようなものです。私が取り組んでいるショップでは、製品のサイズや色などの魅力的な機能は必要ありません(私はこれらの製品のうちの5つ、そのうちの3つが必要です)。 "私はあなたのアプローチを理解していますが、プロジェクトが大きくなる可能性がある場合は、私は間違いなくそれを使用します。 – mailo

+0

OPの状況を改善してくれてありがとうございますが、彼の質問にも答えています。同様の状況に遭遇し、あなたが提供した答えを持っていることが非常に役に立ちます。 – Navarr

関連する問題