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快速計數查詢(這將被緩存,我認爲),而不是依靠緩存值,必須由您的代碼或數據庫觸發器每次更改購物車產品時重新生成。
非常感謝,這正是我期待的那種迴應。我正在從事的商店不需要任何花哨的功能,如產品尺寸或顏色,(我只需要有一個功能說:我需要這些產品中的5個,其中3個),所以我認爲在我的情況下「數量「專欄能夠完成這項工作,儘管我理解你的方法,如果項目能夠變得更大,我肯定會使用它。 – mailo
謝謝你沒有改善OP的情況,但也回答了他的問題 - 因爲我遇到過類似的情況,並且提供的答案非常有幫助。 – Navarr