如果您有一个数据模型,其中一个表是一个只有guid
列的guid
表,并且许多表的主键引用guid
,您会如何推荐?将这种逻辑融入Yii?要创建任何guid
能力的新模型,您必须先创建guid
。放置这种逻辑的正确位置在哪里?
编辑:更具体地说,这是我面临的问题:
tbl_guid
,其中一列guid
是一个MySQL BIGINT
tbl_foo
)在guid
guid
PK tbl_guid
Foo
模型具有self::BELONGS_TO, 'Guid', 'guid'
Foo
guid
,直到我实际保存(并以其他方式验证)Foo
Foo
永远不会验证,因为它没有guid。编辑2:我已经发布了自己的答案,但我希望有人能提出更好的答案/改进建议。以下是我的回答问题:
owner
遵守某些界面,因此我们不必抛出一堆条件来检查owner
是否有属性或方法,等null
的{{1}},从所需属性列表中删除guid
仍然是错误的。答案 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;
}