【问题标题】:Attaching a count variable to an object将计数变量附加到对象
【发布时间】:2013-04-23 12:51:50
【问题描述】:

我需要一些帮助才能在 CGridView 中显示每个用户的帖子数。

例如: 我有一个用户和帖子模型。 我可以通过 $user->posts 访问用户的帖子 有什么我可以添加到 $user->num_posts

【问题讨论】:

    标签: yii counting cgridview


    【解决方案1】:

    您应该简单地使用统计关系,例如在您的用户模型中:

    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 日志就可以确定了。

    【讨论】:

    • 我们最终会得到 2*N+1 个 SQL 查询。可以吗?。所以我最终会得到 1 个 cgridview 的 500k+ SQl 查询?如果我不明白,你能解释一下吗?谢谢。
    【解决方案2】:

    您可以在 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;
        }
    

    然后在您看来,只需将 user->id 传递给 getter,它就会返回该用户的帖子数。像这样的:

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

    问候。

    【讨论】:

    • 你不能只执行一条 SQL 语句来避免从帖子中获取所有数据(findall)并让 SQL 服务器返回一个计数吗?那会快得多,imo。你怎么看?
    • 我没有用 sql 计数和这个 getter 测试速度。在我的情况下,因为我有 cgridview 与数千个用户和列表模型中的列表计数。它工作正常,但我会尝试使用 sql。谢谢。
    • 对不起,我撒谎了,因为我有这个 sql 语句$provider=Lists::model()->findall('user_id=:user_id', array(':user_id'=> $criteria));
    • 如果它是类似 count(*) 的东西,那么它会更快。在这种情况下,我看不出区别。时间~一样。这里的计数与自动增量变量的选择相同。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2014-02-06
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多