2012-02-21 66 views
1

在我的應用程序中,我有所有表共用的字段,如創建日期,更新日期等。要分配這些值,我使用beforeValidate回調。現在,這callback是所有型號相同。在yii中創建基本模型類

爲了避免代碼重複,我想創建一個基礎模型類。

但是,當我試圖創建一個基本模型時,yii拋出錯誤,說table cannot be found in database,這是真的,因爲我沒有這個基本模型的任何表。

有什麼辦法可以創建基礎模型類。

+0

您使用的是cactiverecord嗎? – 2012-02-21 12:34:28

+0

@ bool.dev我使用的ActiveRecord – robert 2012-02-21 12:53:13

+0

ok..see我的編輯工作solution..it恕我直言 – 2012-02-21 12:55:12

回答

1

看看CTimeStampBehavior

對你沒有幫助的事情,你可以自己寫一個行爲類。

希望這會有所幫助。

編輯:
假設您正在使用ActiveRecords。

如果你想創建一個新的基礎模型,你可以這樣做:

abstract class MyBaseARClass extends CActiveRecord{ 
    protected function beforeValidate(){ 
      if(parent::beforeValidate()){ 
        // assign your fields 
        return true; 
      } 
      else return false; 
    } 
} 
+0

,你應該去ctimestampbehavior如果它可以在你的情況下使用,否則ofcourse你可以使用一個新的基類,還是讓我知道是否需要澄清。 – 2012-02-21 12:42:02

0

您是否創建了基表?考慮Yii框架,在模型和基礎模型之間建立關係可能會更容易。

2

是的,如果你使用動態數據庫結構,工作或有其他原因與誼ActiveRecord的工作,而不爲每個表創建類在DB,你可以使用smartActiveRecord yii extension

我分開這幾年分鐘再予前從我的其他擴展名 - 增加了版本沒有任何模型(它會將所有的數據在插入&更新特殊表AR行爲(和創建它,如果它是不存在的),它具有與源表+「修訂字段」和主鍵分機相同的結構由此字段結束。

SmartAR.php source,在評論中有用法的例子。

+0

您也可以爲每個表創建基類和特定類,然後您需要在每個特定的模型類中至少定義「tableName」和靜態「模型」方法。 (或者你可以嘗試使用get_class($ this)來檢測基類中的表名, – Nayjest 2012-02-21 18:08:08

0

在你的情況,你需要重寫

public static function model($className=__CLASS__) 
{ 
    return parent::model($className); 
} 

在每個子類中的Yii所以會知道使用模型的表。否則,它會嘗試使用基類作爲表名。

I.e.

class User extends BaseActiveRecord { 

    public static function model($className=__CLASS__) 
    { 
     return parent::model($className); 
    } 

}