【问题标题】:creating base model class in yii在 yii 中创建基础模型类
【发布时间】:2012-02-21 10:32:02
【问题描述】:

在我的应用程序中,我有所有表共有的字段,例如创建日期、更新日期等。要分配这些值,我使用beforeValidate 回调。现在,这个callback 对所有型号都是一样的。

为了避免代码重复,我想创建一个基础模型类。

但是,当我尝试创建一个基本模型时,yii 抛出错误说table cannot be found in database,这是真的,因为我没有这个基本模型的任何表。

有什么方法可以创建一个基础模型类。

【问题讨论】:

  • @bool.dev 我正在使用 activerecord
  • 好的..查看我编辑的解决方案..它有效

标签: yii


【解决方案1】:

是的,如果您使用动态数据库结构或有其他原因使用 Yii ActiveRecord 而不为数据库中的每个表创建类,您可以使用smartActiveRecord yii extension

我在几分钟前将它与我的其他扩展分开——AR 行为将版本控制添加到任何模型(它将插入和更新中的所有数据复制到特殊表(如果不存在则创建它),具有相同的结构源表+“修订字段”和该字段扩展的主键。

SmartAR.php source,在cmets中有使用示例。

【讨论】:

  • 您也可以为每个表创建基类和特定类,然后您需要在每个特定模型类中至少定义“tableName”和静态“模型”方法。 (或者您可以尝试使用 get_class($this) 检测基类中的表名
【解决方案2】:

看看CTimeStampBehavior

如果这对您没有帮助,您可以自己编写一个 behavior 类。

希望这会有所帮助。

编辑:
假设您正在使用 ActiveRecords。

如果你想创建一个新的基础模型,你可以这样做:

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

【讨论】:

  • 恕我直言,如果可以在您的情况下使用 ctimestampbehavior,您应该选择它,否则您当然可以使用新的基类,让我知道是否需要任何澄清。
【解决方案3】:

您是否创建了基表?考虑一下 Yii 框架,在模型和基础模型之间建立关系可能更容易。

【讨论】:

    【解决方案4】:

    在你的情况下,你需要覆盖

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

    在每个子类中,这样 Yii 就会知道要为您的模型使用哪个表。否则它将尝试使用基类作为表名。

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

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2014-05-15
      • 2012-10-25
      • 1970-01-01
      • 2011-09-28
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多