2013-09-21 61 views
0

我有一個CakePHP模型,我們稱之爲Thing,它有一個名爲ItemView的關聯模型。 ItemView代表Thing項目的一頁視圖。我想顯示Thing多少次已經觀看的,所以我在我的觀點如下:使用大型結果集優化查詢

<?php echo count($thing['ItemView']); ?> 

這工作,但隨着時間的推移結果集此查詢的是會得到巨大的,因爲它是目前正在返回像這樣:

array(
    'Thing' => array(
     'id' => '1', 
     'thing' => 'something' 
    ), 
    'ItemView' => array(
     (int) 0 => array(
      'id' => '1', 
      'thing_id' => 1, 
      'created' => '2013-09-21 19:25:39', 
      'ip_address' => '127.0.0.1' 
     ), 
     (int) 1 => array(
      'id' => '1', 
      'thing_id' => 1, 
      'created' => '2013-09-21 19:25:41', 
      'ip_address' => '127.0.0.1' 
     ), 
     // etc... 
    ) 
) 

我如何能適應模型find()檢索像這樣:

array(
    'Thing' => array(
     'id' => '1', 
     'thing' => 'something', 
     'views' => 2 
    ) 
) 

無負載整個ItemView關係進入內存?

謝謝!

回答

0

所以這是非常簡單的,我們可以使用countercache - 蛋糕確實爲你計數,每當一個記錄添加到/刪除了ItemView

  • 沒有在你的Thing.php模型來更改

  • 在您的things表中添加一個新的INTviews

  • 在你ItemView.php模型中,添加counterCache這樣的:

    public $belongsTo = array(
        'Thing' => array(
         'counterCache' => 'views' 
        ) 
    ); 
    
然後在下一次

,當你通過ItemView做添加/刪除,蛋糕會自動重新計算計數和緩存爲views你,所以下一次當您進行查詢時,您還需要確保您指定recursive = -1@Paco Car has suggested in his answer

$this->Thing->recursive = -1; 
$this->Thing->find(...); //this will returns array of Thing + the field "views" 

// --- OR --- 

$this->Thing->find(array(
    'conditions' => array(
     //... your usual conditions here 
    ), 

    //... fields, order... etc 

    //this will make sure the recursive applies to this call, once only. 
    'recursive' => -1 
);