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