2013-04-23 3 views
0

Мне нужна помощь в отображении количества сообщений каждого пользователя в CGridView.Присоединение переменной счетчика к объекту

Например: У меня есть модель пользователя и сообщения. Я могу получить доступ к сообщениям пользователя через $ user-> posts Есть ли что-то, что я могу добавить, чтобы иметь $ user-> num_posts

ответ

-1

Вы можете использовать getter в своей модели Post. Что-то вроде этого:

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; 
    } 

Затем на ваш взгляд, просто передать user-> идентификатор получателя и он вернет вам кол-сообщений для этого пользователя. Что-то вроде этого:

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

+0

Я не тестировал скорость с подсчетом sql и этим getter. В моем случае, потому что у меня есть cgridview с тысячами пользователей и количеством списков из модели списка для них. Он отлично работает, но я попробую с sql. Спасибо. – ineersa

+0

И жаль, что я лгал, потому что у меня есть этот sql-оператор '$ provider = Lists :: model() -> findall ('user_id =: user_id', array (': user_id' => $ criteria));'. – ineersa

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

EDIT: Вы также должны использовать жадную загрузку, чтобы построить свой DataProvider, например :

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

О запросах SQL, это следует использовать только 3 запросы:

  • один запрос для подсчета GridView страницы,
  • один запрос, чтобы получить пользователь модель,
  • один запрос, чтобы получить пользователь NUM_POSTS.

Просто взгляните на журналы Yii, чтобы быть уверенным.

+0

* мы получим 2 * N + 1 SQL-запросы *. все хорошо?. Итак, я получаю запросы 500k + SQl для 1 cgridview ?. Если я не понимаю, что вы можете объяснить? Спасибо. – ineersa

+0

Извините, вы ошиблись, ответьте на обновления. – soju