2013-04-23 101 views
0

我需要一些幫助來顯示每個用戶在CGridView中的帖子計數。將計數變量附加到對象

例如: 我有一個User和Post模型。 我可以通過$ user-> posts 訪問用戶的帖子有什麼我可以添加有$ user-> num_posts

回答

-1

您可以在Post模型中使用getter。 事情是這樣的:

public static function getpostscount($id) 
    { 
     $total=0; 
     $provider=Post::model()->findall('user_id=:user_id',array(':user_id'=>$id)); 
     foreach ($provider as $data) 
     { 
       if ($data->userid==$id)//userid name of column with user id in post model 
       {$total++; 
       } 

     } 
     return $total; 
    } 

然後在你看來只是通過用戶> id來吸氣劑,它會回報你的職位數爲這個用戶。像這樣的:

echo "User have".Post::model()->getpostscount($user->id);//$user->id is id of user for wich we will look count of posts 

問候。

+0

難道你不能只是執行一個SQL語句,以避免從帖子(findall)獲取所有數據,只是讓SQL服務器返回一個計數?這會更快,imo。你怎麼看? – JorgeeFG 2013-04-23 13:12:02

+0

我沒有測試與sql計數和這個getter的速度。在我的情況下,因爲我有cgridview數以千計的用戶和清單模型列表的計數他們。它工作正常,但我會嘗試與SQL。謝謝。 – ineersa 2013-04-23 13:16:51

+0

對不起,我說謊,因爲我有這個SQL語句'$ provider = Lists :: model() - > findall('user_id =:user_id', array(':user_id'=> $ criteria));'。 – ineersa 2013-04-23 13:22:45

2

您應該簡單地使用stat關係,例如,在您的用戶模式:

public function relations() 
{ 
    return array(

    // ... 
    'posts' => array(self::HAS_MANY, 'Post', 'user_id'), 
    'num_posts' => array(self::STAT, 'Post', 'user_id'), 
    // ... 

); 
} 

http://www.yiiframework.com/doc/guide/1.1/fr/database.arr#statistical-query

編輯: 您還應該使用預先加載來建立你的數據提供器,例如:

$criteria=new CDbCriteria; 
$criteria->with('num_posts'); 

關於SQL查詢,這應該只使用3查詢:

的gridview的頁數
  • 一個查詢,
  • 一個查詢來獲取用戶的機型,
  • 一個查詢來獲取用戶NUM_POSTS。

只要看看Yii的日誌就可以了。

+0

*我們最終會得到2 * N + 1個SQL查詢*。可以嗎?。那麼我最終將得到1個cgridview的500k + SQl查詢?如果我不明白你能解釋什麼?謝謝。 – ineersa 2013-04-23 13:52:55

+0

抱歉,你錯了,回答更新。 – soju 2013-04-23 14:14:46