4

我想知道是否有人遇到过这个问题。
假设我有两个表:产品和购物车(多对多相关)。

现在,加入表有额外的列 - 数量(购物车中有多少特定类型的产品)。


我的问题是我无法通过以下关系访问“金额”列:

公共职能关系()
{       
    返回数组(
           'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'),

    );
}

我也试过:

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

没有运气。

4

1 回答 1

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

这样,您将在 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.

于 2011-07-26T08:45:46.837 回答