2013-04-12 78 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

謝謝,但你肯定沒有簡單的方法來計數沒有創建額外的關係? –