2012-06-21 58 views
5

YII中ActiveRecord和model之間的關係或區別是什麼?區別ActiveRecord和model()在yii中?

我正在嘗試登錄is_object(CActiveRecord::model('Project'));並期待false但它返回true;

由於日誌記錄表明它是一個對象,我認爲它代表表中的一行,但我找不到任何代表coloumns的屬性。

另外http://www.yiiframework.com/doc/api/1.1/CActiveRecord#model-detail指出它返回一個CActiveRecord類的實例,但我找不到該對象中表行的任何值。

+0

和Yii一起工作了幾個月,我發現ActiveRecord類同時處理ActiveRecord和Model都很奇怪。對我來說感覺很奇怪。 –

回答

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 

編輯:

而且this post在論壇上說:(一流水平與靜態之間的區別滿足部門首長)

職業等級的方法是有效的靜態方法但與能夠使用繼承利益。也就是說,您可以在子類中重寫Class Level Method的操作,而如果使用靜態方法,則無法重寫它。 .... 所以,一般來說,你應該使用類級別的方法,而不是靜態方法,因爲它給你繼承的好處,儘管它可能會感覺有點奇怪。然後你使用$ class :: model() - > method()來調用它們。

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

正如你可以看到返回一個對象

+0

謝謝。簡單而完整的答案。 – shgnInc

相關問題