2012-02-01 68 views
0

我不確定在以下情況下使用正確的邏輯。這種情況會在我的應用中出現好幾次,我會假設,也可能會被其他人體驗到。Yii中的相關模型中的STAT關係

在Yii我有一個loadModel函數返回一個CActiveRecord。

的功能如下:

$model=Product::model()->with('performance','subcategory','sponsor')->findByPk($id); 

正如你所看到的,我熱切地呼喚3間的關係。其中一種關係 - 性能 - 是HAS_MANY關係,與用戶對產品的評論有關。

因此,對於產品x,可能有100條評論,所有的日期和評分都不同。

什麼,我試圖做的是:

  1. 把所有性能數據(因此所有的100條評論)
  2. 拉中最近的性能數據評分(只要提交在過去120天)

邏輯上的混亂是這樣的。 我應該在我的模型類中創建一個函數,通過$model->performance獲取最新信息(#2)。

我應該爲這個精緻的數據創建一個完全獨立的關係嗎?

CListView中的每個產品都需要最新的審閱數據,並且ListView需要通過此數據進行排序。所以,它好像需要直接附加到傳遞到視圖中的產品活動記錄。

從性能角度和邏輯角度來看,我該如何處理?

順便說一句,這裏是當前的代碼,我嘗試使用不正常:

public function scopes() 
{ 
    return array(
     'recentPerf'=>array(
      'condition'=>'perf_date > ' . strtotime('-120 days', strtotime(new CDbExpression('NOW()'))), 
      'order'=>'perf_date DESC', 
      'limit'=>1, 
     ) 
    ); 
} 

預先感謝您的任何建議!

Uday的回答得到了範圍工作 - 現在如何正確的方式來使用範圍? 我應該將這個數量與當前模型一起傳遞嗎?

即我可以將這個到:

$model=Product::model()->with('performance','subcategory','sponsor')->findByPk($id); 

? 我如何測試它,以確保它的工作是:

$maxPerformance = ProdPerformance::model()->recentPerf()->find(); 

和我然後通過該變量視圖。這似乎是處理這種情況的一種非常「不潔淨」的方式。它是否應該與原始$model變量一起傳遞?

回答

0

我不知道,但可能是以下行有一個catch

'condition'=>'perf_date > ' . strtotime('-120 days', strtotime(new CDbExpression('NOW()'))), 

條件是將被髮送到MySQL這樣的日期字符串應該是沒有在PHP MySQL的格式的數據,試試這個

'condition'=>'perf_date > CURRENT_DATE - INTERVAL 120 DAYS', 
+0

烏代,謝謝你的評論。這樣做,並得到了範圍工作。 (一個例外,MySQL語法是INTERVAL 120 DAY)。 – w00tw00t111 2012-02-01 19:31:23

+0

對,我很困惑,謝謝兄弟。 – 2012-02-02 04:53:11

+0

所以當我更深入地看待它。無論出於何種原因,查詢(recentPerf)都返回最近的性能 - 無論產品ID如何。因此,舉例來說,如果有3種產品都有多個評論 - 我希望每個評論都有最新的評論。相反,它會顯示最近的審閱期(無論您正在查看哪種產品)。 – w00tw00t111 2012-02-02 14:37:12