7

ActiveRecordとYIIのモデルの関係または違いは何ですか?

私はログに記録しようとしていて、is_object(CActiveRecord::model('Project'));期待していfalseましたが、返されましたtrue;

ロギングはそれがオブジェクトであることを示していたので、それはテーブルの行を表していると思いましたが、列を表す属性は見つかりませんでした。

また、 http: //www.yiiframework.com/doc/api/1.1/CActiveRecord#model-detailには、クラスのインスタンスが返されると記載されていますCActiveRecordが、そのオブジェクトでテーブル行の値が見つかりませんでした。

4

2 に答える 2

8

答えはドキュメントのリンクにmodel()あり、クラスレベルのメソッドであり、次のようになります。

指定されたARクラスの静的モデルを返します。返されるモデルは、ARクラスの静的インスタンスです。これは、クラスレベルのメソッド(静的クラスメソッドに似たもの)を呼び出すために提供されています。

たとえば、次のようにする$model=CActiveRecord::model('Project');と、それを使用して$model、CActiveRecordのすべてのクラスレベルのメソッドを呼び出すことができます。

$allModels = $model->findAll(); // will give you all the models of Project
$someModel = $model->findByPk('pkValue'); // will give you the row with primary key value = pkValue 
$model->deleteAll(); // will delete all the records of Project
// and so on

編集:

また、フォーラムのこの投稿には次のように書かれています:(クラスレベルと静的メソッドの違い)

クラスレベルのメソッドは事実上静的メソッドですが、継承を使用できるという利点があります。つまり、サブクラスのクラスレベルメソッドの操作をオーバーライドできますが、静的メソッドを使用した場合はオーバーライドできません。....したがって、一般的には、静的メソッドではなく、クラスレベルのメソッドを使用する必要があります。これは、少し奇妙に感じるかもしれませんが、継承の利点を提供するためです。次に、$ class :: model()-> method()を使用してそれらを呼び出します。

于 2012-06-21T05:05:46.960 に答える
2

ActiveRecordはパターンです。リレーショナルデータベースにデータを格納するためのパターン。MVCパターンのモデルは、データの一部です。つまり、YiiはモデルのActiveRecordを実装するMVCフレームワークです。

モデルメソッドはこちら

public static function model($className=__CLASS__)
{
    if(isset(self::$_models[$className]))
        return self::$_models[$className];
    else
    {
        $model=self::$_models[$className]=new $className(null);
        $model->_md=new CActiveRecordMetaData($model);
        $model->attachBehaviors($model->behaviors());
        return $model;
    }
}

ご覧のとおり、オブジェクトを返します

于 2012-06-21T05:05:13.733 に答える