Php 多对多,再加一列
我想知道是否有人面临过这个问题Php 多对多,再加一列,php,many-to-many,yii,relation,Php,Many To Many,Yii,Relation,我想知道是否有人面临过这个问题 让我们假设我有两个表:products和carts(多对多相关) 现在,联接表有额外的列-金额(购物车中有多少特定类型的产品) 我的问题是,我无法通过以下关系访问“金额”列: public function relations() { return array( 'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_i
让我们假设我有两个表:products和carts(多对多相关)
现在,联接表有额外的列-金额(购物车中有多少特定类型的产品)
我的问题是,我无法通过以下关系访问“金额”列: public function relations() { return array( 'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'), ); } 公共职能关系() { 返回数组( 'products'=>array(self::MANY_MANY,'Product','cart_products(cart_id,Product_id)'), ); } 我还尝试: 'products'=>array(self::HAS_MANY, 'Product','product_id','through'=>'cart_products'), 'products'=>array(self::有许多,'Product'、'Product\u id'、'through'=>'cart\u products'),
没有运气。Yii的多功能实现有一些限制,这些限制可能会在以后的Yii版本中解决 解决方法是为多个表使用一个模型类。例如,创建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 magic公共属性中引用CartProducts模型,并可以更新您的“金额”
现在正是我说我不喜欢你解决这个问题的方法的时候了,因为你必须保留两个事实(db中映射到购物车的实际产品数量和相关表中的计数器缓存“数量”字段)。除非您有非常非常繁重的应用程序需要此db非规范化,否则我将使用“计数器关系”来获取产品计数,而不是将该值缓存在列中,如下图所示(将以下关系添加到您的购物车模型中):
这样,您可以调用cart->protuctsAmount属性,它将通过一个简单而快速的计数查询返回实际金额(我想这将被缓存)而不是依赖于每次更改购物车产品时必须由代码或db触发器重新生成的缓存值。非常感谢,这正是我希望得到的响应。我正在经营的商店不需要任何花哨的功能,如产品大小或颜色,(我只需要有一个功能说明:我想要这些产品中的5个,还有3个)所以我认为在我的例子中“数量”“column做了这项工作,尽管我理解你的方法,如果项目能够扩大,我肯定会使用它。感谢你没有改善OP的情况,但也回答了他的问题——因为我遇到过类似的情况,你提供的答案非常有帮助。
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)'),
);
}