2013-08-16 25 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'.The財產將優先屬性。給你的關係一個不同的名字。 (然後訪問它的'name'屬性來獲取實際的「Disabled」字符串。) – DCoder

+0

好吧我在關係中將其更改爲status_name,並在with()中用var_dumping將它改爲NULL,有什麼想法? – JorgeeFG

+1

啓用[查詢日誌記錄](http://stackoverflow.com/questions/10629728/yii-how-to-print-sql-used-by-findall/10629915#10629915),查看生成的數據庫查詢。如果查詢正確,請在調試器中跳過代碼... – DCoder

回答

0

當你看到$moduleAR->status時,你會得到整個Status模型實例,而不是它的id。因此,請繼續深入探究該事例:

$moduleAR->status->name

這就是ActiveRecord的魔力是爲;)

成反比,如果你有狀態的模型,你應該有一個關係,有說是這樣的:

'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 
}