2014-07-23 2 views
0
YII

의 분류와 MANY_MANY 관계를 선언 :는이 전 다음과 같은 데이터베이스 구조 있다고 가정 해 봅시다

database schema 나는 "눈 색깔", "머리 색"과 같은 분류 유형의 목록이 포함 된 Classifier 테이블이를, "신발 사이즈"등. 이것은 분류 자에 해당하는 속성 목록이있는 Property 테이블에 연결됩니다. 예를 들어, 머리 유형에 대해서는 , brown, whitered, 신발 크기는 US 8, US 9US 10 일 수 있습니다. Person 테이블은 MANY_MANY 방식으로 Property 테이블에 연결됩니다.

이 구조는 같은 YII에 선언하면 너무

'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 값이 slim 또는 athletic과 같기 때문에 새로운 관계를 선언하지 않고 $person->build을 사용할 수 있습니까?

뿐만 아니라, 나는 build'slim'Property에 해당하는 것을 모두와 비교 Classifier_id 반대로 너무 $my_criteria->compare('build.name', 'slim')처럼 CDbCriteria에서 다음을 사용하고 싶습니다.

답변

0

당신은 그것을위한 마법 __get() 사용할 수 있습니다 : 당신의 사람 모델 (죄송 테스트되지 않은 코드)에

는 :

public function __get($prop) 
{ 
    if ($this->properties->hasAttribute($prop)) 
    { 
     return $this->property->$prop; 
    } 

    return null; 
    // or maybe better 
    return parent::__get($prop); 
} 

CActiveRecords에게 __get()를 오버라이드 (override)하는 것은 문제가 될 수 있음을 arware하고 사용하지 않는 것이 좋습니다 . 그걸 확인해야 해.

+0

감사합니다. 시작되었습니다. 그러나 CDbCriteria와 함께 사용하면이 기능이 작동하지 않을 수 있습니다. 나는 그 질문을 갱신 할 것이다. – Beowulfenator

관련 문제