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'),
);
}
这样,您将在 Cart 实例的 cartProducts 魔术公共属性中引用 CartProducts 模型,并且能够更新您的“金额”。
现在是我说我不喜欢你解决问题的方法的好时机 - 拥有包含购物车中产品数量的“数量”列,因为你必须保持两个事实(映射的实际产品数量到数据库中的购物车和相关表中的计数器缓存“数量”字段”)。除非您有非常非常重的应用程序需要这种数据库非规范化,否则我会做一个“计数器关系”来获取产品计数,而不是在列中缓存该值,如下所示(将以下关系添加到您的 Cart 模型):
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)'),
);
}
This way, you can call the cart->protuctsAmount property and it will return the actual amount with a simple and fast count query (which will be cached I think) instead of relying on cached value that have to be regenerated by your code or by db triggers every time you change the cart products.