2013-04-12 74 views
0

我有一个名为 “relationName” 一HAS_MANY关系,Yii如何计算相关模型(getRelation和params)?

这样我就可以使用

$model->relationName; 

或使用

$model->getRelated('relationName'); 

我还可以得到relatedModels的一个子集得到所有相关的模型,由添加参数

$model->getRelated('relationName', true, array('fieldName'=>'val')); 

所以,我会得到一个子集所有相关的模型,这字段名 =“VAL

,但我怎么能指望他们?

这个想法看起来像一个糟糕(因为它会采取所有模型,然后指望他们):

count($model->getRelated('relationName', true, array('fieldName'=>'val'))); 

我需要的东西,这将最终建立与COUNT()查询,并返回结果。

使用STAT关系也貌似好主意(因为我已经在代码中描述的关系,我为什么要复制关系的描述?)

所以,有没有来算有关的任何好的解决方案(HAS_MANY)带有动态参数的模型?

回答

1

好了,我有这样的模型: 产品展示(产品) 订单(的order_id,product_id) OrderProduct(的order_id,product_id)

产品型号有关系

“订单'=> array(self :: HAS_MANY,'Order',array('order_id'=>'order_id'),'through'=>'orderedProducts'),

我的任务是 - 计算每个产品t->订单,而无需加载所有订单模型。

如罗斯建议,我创建STAT关系

'statOrders'=>数组(自:: STAT, '订单',阵列( '的order_id'=> 'ORDER_ID'), '到'=>” orderedProducts通过‘属性),

最后,当我打电话$产品 - > statOrders,我得到了一个异常CStatRelation没有’

enter image description here

这意味着,如果我想使它工作,我必须发明另一种方式来描述产品之间的关系订单..这比重复还要糟糕。

最后,我想出了这个解决办法:

$c=$product->getRelated('orders', true, аггау('select'=>'CОUNТ(огdегѕ.огdег_іd) as order_id', 'gгоuр'=>'ргоduсt_іd')); 
$count=$c[О]->order_id; 

•无需描述新的关系

•这使得清洁SQL查询:

system.db.CDbCommand.query(SELECT COUNT(orders.order_id) as order_id, `orders`.`order_id` AS `t1_c0` FROM `orders` `orders` LEFT OUTER JOIN `orders_products` `orderedProducts` ON (`orderedProducts`.`order_id`=`orders`.`order_id`) WHERE (`orderedProducts`.`product_id`=:ypl0) GROUP BY product_id. Bound with :ypl0='458739') 

•您可以动态地添加PARAMS : enter image description here

•依此类推,你可以指望在订单的产品数量(以每个订单和产品数量): enter image description here

我现在的最终解决方案: enter image description here

3

如果您希望它作为COUNT()查询运行,您最好的选择是使用stat关系。

'countOfRelationName' => array(self::STAT, 'Relation', 'field', 'condition'=>'field = val')

+0

谢谢,但你肯定没有简单的方法来计数没有创建额外的关系? –