Oop 在Yii中实现GUID

Oop 在Yii中实现GUID,oop,design-patterns,yii,Oop,Design Patterns,Yii,如果您有一个数据模型,其中一个表是guid表,只有guid列,并且许多表都有一个主键引用guid,您建议如何将这种类型的逻辑合并到Yii中?要创建任何guidable对象的新模型,必须首先创建guid。这种逻辑应该放在哪里 编辑:更具体地说,以下是我面临的问题: 我有一个guid表,tbl\u guid,其中一列是MySQLBIGINT 一些表,如tbl\u foo,在tbl\u guid Foo模型具有关系self::属于'Guid'、'Guid' 在我明确准备创建Foo 我想以某种方式延迟

如果您有一个数据模型,其中一个表是
guid
表,只有
guid
列,并且许多表都有一个主键引用
guid
,您建议如何将这种类型的逻辑合并到Yii中?要创建任何
guid
able对象的新模型,必须首先创建
guid
。这种逻辑应该放在哪里

编辑:更具体地说,以下是我面临的问题:

  • 我有一个guid表,
    tbl\u guid
    ,其中一列是MySQL
    BIGINT
  • 一些表,如
    tbl\u foo
    ,在
    tbl\u guid
  • Foo
    模型具有关系
    self::属于'Guid'、'Guid'
  • 在我明确准备创建
    Foo
  • 我想以某种方式延迟保存我的
    guid
    ,直到我实际保存(并已验证)
    Foo
  • 但是,
    Foo
    从不验证,因为它没有guid
编辑2:我已经发布了我自己的答案,但我希望有人有更好的答案/改进建议。以下是我回答的问题:

  • 我们如何强制
    所有者
    遵守一些接口,这样我们就不必加入一堆条件来检查
    所有者
    是否有属性或方法等
  • 即使数据库不接受
    guid
    null
    ,从所需属性列表中删除
    guid
    似乎仍然是错误的

  • 继承。如果您刚才实现了我的BaseModel代码,则可以重写BaseModel中的
    \uu construct()
    方法来创建GUID类的实例

    基本模型:

    public function __construct()
    {
        parent::__construct();
    
        $newGuid = new GUID();
    
        return $this;
    }
    

    请参见继承。如果您刚才实现了我的BaseModel代码,则可以重写BaseModel中的
    \uu construct()
    方法来创建GUID类的实例

    基本模型:

    public function __construct()
    {
        parent::__construct();
    
        $newGuid = new GUID();
    
        return $this;
    }
    

    请参见

    这是我能想到的最好的方法:

    guid
    able模型创建新的
    CActiveRecordBehavior

    public function beforeSave() {
    
        if (!$this->owner->guid) {
    
            $guid = new Guid;
            $guid->save();
    
            $this->owner->guid = $guid->guid;
        }
    }
    
    将行为附加到模型上,或在模型的
    行为
    数组中定义它

    public function init() {
        $behavior = new GuidBehavior;
        $this->attachBehavior('GuidBehavior', $behavior);
    }
    
    删除所需的
    guid
    ,以便验证不会失败:

    array('name', 'required'), //guid isn't here
    
    试验


    这是我能想到的最好的:

    guid
    able模型创建新的
    CActiveRecordBehavior

    public function beforeSave() {
    
        if (!$this->owner->guid) {
    
            $guid = new Guid;
            $guid->save();
    
            $this->owner->guid = $guid->guid;
        }
    }
    
    将行为附加到模型上,或在模型的
    行为
    数组中定义它

    public function init() {
        $behavior = new GuidBehavior;
        $this->attachBehavior('GuidBehavior', $behavior);
    }
    
    删除所需的
    guid
    ,以便验证不会失败:

    array('name', 'required'), //guid isn't here
    
    试验


    因此,如果我走继承路线,假设我正在创建一个模型,但我不一定打算
    save()
    it。如果我在构造函数中创建
    guid
    (并且不保存)时花了整整九码的时间,这难道不会导致一堆未使用的guid吗?我明白了。如果我这样做,当我调用
    $model->save()
    时,如果GUID被定义为一个关系,我是否足够“聪明”地知道首先保存GUID?另外,重写
    \u construct()
    会给我带来无限循环。。。你是说
    init()
    ?所以,如果我走继承路线,假设我正在创建一个模型,但我不一定打算
    save()
    它。如果我在构造函数中创建
    guid
    (并且不保存)时花了整整九码的时间,这难道不会导致一堆未使用的guid吗?我明白了。如果我这样做,当我调用
    $model->save()
    时,如果GUID被定义为一个关系,我是否足够“聪明”地知道首先保存GUID?另外,重写
    \u construct()
    会给我带来无限循环。。。你是说
    init()