在Yii中实现GUID

时间:2013-03-02 00:23:22

标签: oop design-patterns yii

如果您有一个数据模型,其中一个表是一个只有guid列的guid表,并且许多表的主键引用guid,您会如何推荐?将这种逻辑融入Yii?要创建任何guid能力的新模型,您必须先创建guid。放置这种逻辑的正确位置在哪里?

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

  • 我有一个guids表tbl_guid,其中一列guid是一个MySQL BIGINT
  • 某些表格(例如tbl_foo)在guid
  • 中引用了guid PK tbl_guid
  • Foo模型具有self::BELONGS_TO, 'Guid', 'guid'
  • 的关系
  • 在我准备创建Foo
  • 之前,我不想创建新的guid
  • 我想以某种方式延迟保存我的guid,直到我实际保存(并以其他方式验证)Foo
  • 但是,Foo永远不会验证,因为它没有guid。

编辑2:我已经发布了自己的答案,但我希望有人能提出更好的答案/改进建议。以下是我的回答问题:

  • 我们如何强制owner遵守某些界面,因此我们不必抛出一堆条件来检查owner是否有属性或方法,等
  • 即使数据库不接受null的{​​{1}},从所需属性列表中删除guid仍然是错误的。

2 个答案:

答案 0 :(得分:3)

这是我能想到的最好的:

CActiveRecordBehavior能力模型创建新的guid

public function beforeSave() {

    if (!$this->owner->guid) {

        $guid = new Guid;
        $guid->save();

        $this->owner->guid = $guid->guid;
    }
}

在模型上附加行为,或在模型的behaviors数组中定义它。

public function init() {
    $behavior = new GuidBehavior;
    $this->attachBehavior('GuidBehavior', $behavior);
}

删除guid的必需项,以便验证不会失败:

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

测试

$brand->save();

答案 1 :(得分:0)

继承。如果您不久前实现了我的BaseModel代码,则可以覆盖BaseModel中的__construct()方法以创建GUID类的实例。

BaseModel:

public function __construct()
{
    parent::__construct();

    $newGuid = new GUID();

    return $this;
}

请参阅http://www.yiiframework.com/doc/api/1.1/CActiveRecord