1

私は Yii フレームワークのユーザーです。

ほとんどの場合、以下のサンプル関数のように、関数をモデル ファイルで public static 関数として定義します。

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 に答える