假设我有以下数据库结构:
我有一个Classifier
表,其中包含一个分类器类型列表,如“眼睛颜色”,“头发颜色”,“鞋子尺寸”等。它链接到Property
表,其中包含属性列表对应于分类器。例如,头发类型black
,brown
和{{1}可以有white
,red
,US 8
和US 9
鞋子尺寸。 US 10
表以MANY_MANY方式链接到Person
表。
当这样的结构在yii中声明时,
Property
我可以这样做:
'properties'=>array(self::MANY_MANY, 'Property', 'Xref(Person_id, Property_id)')
但我要找的是分别处理所有属性,例如 foreach ($person->properties as $property) {
echo ($property->classifier->name.': '.$property->name);
}
或$person->hairColor
。
当然,我可以用条件声明多个MANY_MANY关系(仅在Classifier_id上等于某个值)。但为此我需要事先了解所有分类器ID - 根本不灵活。
但有没有办法在yii中声明这种关系,以便自动解析分类器?因此,当我向$person->shoeSize
表格添加新行时,例如Classifier
以及build
或slim
等值时,我可以使用athletic
而无需声明一个新的关系?
不仅如此,我还想在$person->build
中使用这些内容,就像CDbCriteria
一样,而不是将$my_criteria->compare('build.name', 'slim')
与Classifier_id
和{{build
对应的内容进行比较1}}与Property
。
答案 0 :(得分:0)
您可以使用魔术__get()
:
在你的Person模型中(未经测试的代码抱歉):
public function __get($prop)
{
if ($this->properties->hasAttribute($prop))
{
return $this->property->$prop;
}
return null;
// or maybe better
return parent::__get($prop);
}
请注意,重写CActiveRecords __get()可能是个问题,不建议这样做。你应该检查一下。