2014-07-23 57 views
0

分類一MANY_MANY關係比方說,我有以下的數據庫結構:聲明與警予

database schema 我有一個Classifier表包含分類類型,如「睛彩」,「髮色」的名單, 「鞋大小」等。它鏈接到Property表,其具有與分類器對應的屬性列表。例如,它可以具有用於髮型的black,brown,brown,whitered以及用於鞋號的US 8,US 9US 10Person表以MANY_MANY方式鏈接到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$person->shoeSize

當然,我可以聲明多個MANY_MANY與一個條件的關係(只有Classifier_id等於某個值)。但爲此,我需要事先知道所有分類器id - 根本不靈活。

但是有沒有辦法在yii中聲明這個關係,以便它自動解析分類器?因此,當我向Classifier表添加新行時,例如說,build和值slimathletic,我可以只使用$person->build而不聲明新的關係?

不僅如此,我想CDbCriteria使用這些,像這樣$my_criteria->compare('build.name', 'slim'),而不是兩者比較Classifier_id什麼對應buildProperty'slim'

回答

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); 
} 

是arware是壓倒一切的CActiveRecords __get()可能是一個問題,不推薦。你應該檢查一下。

+0

謝謝,這是一個開始。但是,這與CDbCriteria一起使用時可能不起作用。我會更新這個問題。 – Beowulfenator