0

我有一个名为“relationName”的 HAS_MANY 关系,

所以我可以使用所有相关模型

$model->relationName;

或使用

$model->getRelated('relationName');

我还可以通过添加参数获得相关模型的子集

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

所以,我会得到所有相关模型的一个子集,其中fieldName = " val "

但我怎么数呢?

这个想法看起来很糟糕(因为它将采用所有模型然后计算它们):

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

我需要一些最终会使用 COUNT() 构建查询并返回结果的东西。

使用 STAT 关系看起来也是个坏主意(因为我已经在代码中描述了关系,为什么要重复关系的描述?)

那么,有没有什么好的解决方案来计算具有动态参数的相关(HAS_MANY)模型?

4

2 回答 2

3

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

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

于 2013-04-12T16:59:30.520 回答
1

好的,所以我有这样的模型: Product (product_id) Order (order_id, product_id) OrderProduct (order_id, product_id)

产品型号有关系

'orders'=>array(self::HAS_MANY,'Order',array('order_id'=>'order_id'),'through'=>'orderedProducts'),

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

正如罗斯建议的那样,我创建了 STAT 关系

'statOrders'=>array(self::STAT,'Order',array('order_id'=>'order_id'),'through'=>'orderedProducts'),

最终,当我调用 $product->statOrders 时,我得到了一个异常 CStatRelation has no 'through' attribute

在此处输入图像描述

这意味着如果我想让它发挥作用,我必须发明另一种方式来描述产品和订单之间的关系。这比重复更糟糕。

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

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

• 您可以动态添加参数: 在此处输入图像描述

• 以此类推,您可以计算订单中的产品数量(每个订单中的产品数量之和): 在此处输入图像描述

我目前的最终解决方案: 在此处输入图像描述

于 2013-05-02T14:44:46.170 回答