Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多对多,再加一列_Php_Many To Many_Yii_Relation - Fatal编程技术网

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

    );
}