多对多,另一栏

mai*_*ilo 4 php many-to-many relation yii

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

现在,连接表有额外的列数量(购物车中有多少特定类型的产品).


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

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

没有运气.

ddi*_*hev 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'),
    );
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以在Cart实例的cartProducts魔术公共属性中引用CartProducts模型,并且可以更新您的"金额".

现在是我说我不喜欢你解决这个问题的好时机 - 拥有"数量"列来保存购物车中产品的数量,因为你必须保留两个真相(映射的产品的实际数量)到数据库中的购物车和相关表中的计数器缓存"金额"字段").无论你有非常非常繁重的应用程序需要这个数据库非规范化,我会做一个"反制关系"来获取产品数,而不是在列中缓存该值,如下所示(将以下关系添加到您的购物车模型):

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

    );
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以调用cart-> protuctsAmount属性,它将使用简单快速计数查询(我认为将被缓存)返回实际金额,而不是依赖于必须由代码重新生成的缓存值或每次更改购物车产品时都会触发db.