0

如果你有一个数据模型,其中一个表是一个guid只有一guid列的表,并且许多表都有一个引用它的主键guid,你会如何建议将这种类型的逻辑合并到 Yii 中?要为任何有能力的事物创建一个新模型guid,您必须先创建一个guid。放置这种逻辑的正确位置在哪里?

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

  • 我有一个 guid 表tbl_guid,其中有一列guid是 MySQLBIGINT
  • 一些表,如,tbl_foo有一个 PKguid引用guidtbl_guid
  • 模型有Foo关系self::BELONGS_TO, 'Guid', 'guid'
  • 在完全准备好创建之前,我不想创建新的 guidFoo
  • 我想以某种方式延迟我的保存,guid直到我真正保存(并以其他方式验证)Foo
  • 但是,Foo永远不会验证,因为它没有向导。

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

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

2 回答 2

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();
于 2013-03-02T02:27:52.380 回答
0

遗产。如果您之前实现了我的 BaseModel 代码,您可以重写__construct()BaseModel 中的方法来创建 GUID 类的实例。

基本型号:

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

    $newGuid = new GUID();

    return $this;
}

http://www.yiiframework.com/doc/api/1.1/CActiveRecord

于 2013-03-02T00:35:15.643 回答