繁体   English   中英

Yii-模型文件中的大多数功能都应该是静态功能吗?

[英]Yii - are most of functions in model files supposed to be static function?

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

我想知道我做错了吗。

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

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

谢谢!!!

是的,您做错了。

静态方法易于调用,但具有一些体系结构方面的缺点,因此通常应谨慎使用(或什至更好:完全避免使用)。

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

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

接着:

$trashedCount = Post::model()->trashed()->count();

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

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

因此,您想要执行以下操作:

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

您可以看到您正在使用CActiveRecordcountByAttributes方法,而且很妙的是默认作用域是自动应用的,因此您无需进行任何处理。 我建议您花一些时间来学习可用的方法。

然后,您可以查询以下垃圾邮件的数量:

Posts::model()->getTrashedPostCount()

甚至使用魔法

Posts::model()->trashedPostCount

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM