1

我是 Yii 框架用户。

大多数情况下,我在模型文件中将函数定义为公共静态函数,如下面的示例函数。

public static function getTrashedPostCount(){           
    $connection=Yii::app()->db;     
    $sql = "SELECT COUNT(publish_status)
                FROM {{post}}
                WHERE publish_status = 'trash'";              
    $command=$connection->createCommand($sql);
    $postCount = $command->queryScalar();
    return $postCount;      
}   

我想知道我是否做错了。

模型文件中的大多数函数都应该是静态函数吗?

如果我做错或理解错误,请告诉我。

谢谢!!!

4

2 回答 2

7

是的,你做错了。

静态方法很容易调用,但有几个架构上的缺点,所以一般来说它们应该谨慎使用(或者,甚至更好:完全避免使用)。

在这种情况下,没有理由使用静态方法,尤其是编写自定义 SQL 的方法。使用 Yii 的命名范围来实现相同的目标:

class Post extends CActiveRecord
{
    public function scopes()
    {
        return array(
            'trashed'=>array(
                'condition' => "publish_status = 'trash'",
            ),
        );
    }
}

接着:

$trashedCount = Post::model()->trashed()->count();
于 2013-09-03T08:14:57.000 回答
2

你不想使用静态方法,因为那样你就放弃了许多不错的 yii 功能,例如默认范围、事件等。

此外,如果可能,您也不想使用原始 SQL,因为这可能会使转换到其他数据库系统变得复杂。

所以你想做这样的事情:

public function getTrashedPostCount() {
    return $this->countByAttributes(array('publish_status' => 'trash'));
}

你可以看到你正在使用CActiveRecordcountByAttributes方法,而且好处是默认范围是自动应用的,所以你不需要照顾它。我建议您花一些时间来了解您可以使用哪些方法。

然后,您可以像这样查询已删除帖子的数量:

Posts::model()->getTrashedPostCount()

甚至通过使用一些魔法

Posts::model()->trashedPostCount
于 2013-09-03T07:56:04.257 回答