2011-07-26 31 views
4

我想知道是否有人遇到過這個問題。
讓我們假設我有兩個表:產品和購物車(相關的多對多)。

現在,加入表具有額外的列數量(特定類型的多少產品在購物車中)。多對多,另一列


我的問題是,我無法通過以下關係式訪問 「金額」 欄:

 
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表使用一個模型類。例如創建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模型,就能更新你的「量」。

現在是我說我不喜歡你解決問題的方法的好時機 - 擁有保存購物車中產品數量的「金額」欄,因爲你必須保留兩個真值(實際金額在db中映射到購物車的產品以及在相關表中的計數器緩存「amount」字段中)。無論你有非常非常沉重的應用程序需要這個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屬性,它會返回與實際量一個si快速計數查詢(這將被緩存,我認爲),而不是依靠緩存值,必須由您的代碼或數據庫觸發器每次更改購物車產品時重新生成。

+0

非常感謝,這正是我期待的那種迴應。我正在從事的商店不需要任何花哨的功能,如產品尺寸或顏色,(我只需要有一個功能說:我需要這些產品中的5個,其中3個),所以我認爲在我的情況下「數量「專欄能夠完成這項工作,儘管我理解你的方法,如果項目能夠變得更大,我肯定會使用它。 – mailo

+0

謝謝你沒有改善OP的情況,但也回答了他的問題 - 因爲我遇到過類似的情況,並且提供的答案非常有幫助。 – Navarr