2013-08-16 3 views
0

Yii에서 관계를 사용하는 것은 이번이 처음입니다. 질문은 매우 간단합니다.YII의 간단한 관계, 완료 할 수 없습니다

MODULE TABLE 

name - PK 
status - FK status_id 

STATUS TABLE 

id PK 
name 

따라서 각 모듈에는 하나의 상태가 있습니다.

하지만 제대로 작동하지 않는 것 같습니다.

Module.php (모델)

public function relations() 
    { 
    return array(
     'status'=>array(self::BELONGS_TO, 'ModuleStatus', 'status'), 
    ); 
    } 

내가 그들에게 이런 식으로 접근 :

$modulesAR = Module::model()->with('status')->findAll(); 
    if($modulesAR) 
    { 
     foreach($modulesAR as $moduleAR) 
     { 
     $this->modules[ $moduleAR->name ] = array(
      'sessionLimit' => isset($moduleAR->sessionLimit) ? $moduleAR->sessionLimit : 0, 
      'status' => isset($moduleAR->status) ? $moduleAR->status : 'disabled', 
     ); 
     } 
    } 

위해서 var_dump (YII : 응용 프로그램() -> 모듈 -> 모듈;

array(3) { 
    ["digidoc"]=> 
    array(2) { 
    ["sessionLimit"]=> 
    int(0) 
    ["status"]=> 
    string(1) "2" // Should say "Disabled" 
    } 
    ["docusearch"]=> 
    array(2) { 
    ["sessionLimit"]=> 
    int(0) 
    ["status"]=> 
    string(1) "1" // Should say "Enabled" 
    } 
    ["printbox"]=> 
    array(2) { 
    ["sessionLimit"]=> 
    int(0) 
    ["status"]=> 
    string(1) "2" // Should say "Disabled" 
    } 
} 

도움을 주시면 감사하겠습니다.

감사합니다. 에스!

편집 : YII에 의해 실행

쿼리

SELECT `t`.`name` AS `t0_c0`, `t`.`status_id` AS `t0_c1`, `t`.`session_limit` AS `t0_c2`, `status`.`id` AS `t1_c0`, `status`.`name` AS `t1_c1` FROM `ss_module` `t` LEFT OUTER JOIN `ss_module_status` `status` ON (`status`.`id`=`t`.`name`) 

+------------+-------+-------+-------+-------+ 
| t0_c0  | t0_c1 | t0_c2 | t1_c0 | t1_c1 | 
+------------+-------+-------+-------+-------+ 
| digidoc |  2 |  0 | NULL | NULL | 
| docusearch |  1 |  2 | NULL | NULL | 
| printbox |  2 |  0 | NULL | NULL | 
+------------+-------+-------+-------+-------+ 

편집 2 : 마지막

ON (`status`.`id`=`t`.`name`); 

ON (`status`.`id`=`t`.`status_id`); 
변경

은 예상대로 작동합니다. Yii에서 문제를 해결하는 방법을 모릅니다.

+1

모델에는 'status' * 및 * status라는 이름의 속성이 있습니다. 속성이 우선합니다. 관계에 다른 이름을 붙이십시오. (그리고 나서'name' 속성에 접근하여 실제 "Disabled"문자열을 얻습니다.) – DCoder

+0

좋아요. 관계에서 status_name으로 바꿨고, var_dumping으로 with()와 함께 NULL을 돌려 주었습니까? – JorgeeFG

+1

[query logging] (http://stackoverflow.com/questions/10629728/yii-how-to-print-sql-used-by-findall/10629915#10629915)을 활성화하고 생성 된 DB 쿼리를 살펴보십시오. 쿼리가 정확하다면, 디버거에서 코드를 단계적으로 수행하십시오 ... – DCoder

답변

0

$moduleAR->status을 들여다 보면 ID가 아닌 전체 상태 모델 인스턴스가 생성됩니다. 계속해서 그 인스턴스를 들여다 보면

$moduleAR->status->name입니다.

'modules' => array(self::HAS_MANY, 'Module', 'status_id')

을 만들 수 :;

액티브 마법을위한 것입니다 무엇

당신이 상태 모델이있는 경우)

그리고 반대로, 당신이 관계 같은 말을 뭔가를해야한다 가능한 한 :

$status = Status::model()->find(/*somehow*/); 
/* now that $status is an Status instance */ 
foreach ($status->modules as $module) { 
    // here you are! looping over all modules connected to this status 
    // each $module is a full-fledged Module instance 
} 
관련 문제