YII、can和x27中的简单关系;我做不成

YII、can和x27中的简单关系;我做不成,yii,relationship,relation,Yii,Relationship,Relation,这是我第一次在Yii中使用关系,问题很简单 MODULE TABLE name - PK status - FK status_id STATUS TABLE id PK name 因此,每个模块都有一个状态 但我似乎无法让它工作 Module.php(模型) 我通过以下方式访问它们: $modulesAR = Module::model()->with('status')->findAll(); if( $modulesAR ) { forea

这是我第一次在Yii中使用关系,问题很简单

MODULE TABLE

name - PK
status - FK status_id

STATUS TABLE

id PK
name 
因此,每个模块都有一个状态

但我似乎无法让它工作

Module.php(模型)

我通过以下方式访问它们:

$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',
        );
      }
    }
变量转储(Yii::app()->module->modules

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


正如预期的那样工作,因为我不知道如何在Yii中修复它。

当您查看
$moduleAR->status
时,您得到的是整个状态模型实例,而不是它的id。因此只需继续查看该实例:

$moduleAR->status->name

这就是ActiveRecord magic的用途;)

反过来,如果你有状态模型,你应该有这样的关系:

'modules'=>数组(self::有许多'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
}

您的模型有一个名为
status
的属性和一个名为
status
的关系。该属性将优先。给你的亲戚起一个不同的名字。(然后访问它的
name
属性以获得实际的“Disabled”字符串。)好的,我将其在relationship和with()中更改为status_name,其中var_dumping为NULL,有什么想法吗?启用,查看生成的DB查询。如果查询是正确的,请在调试器中跳过代码…我已经用查询更新了问题,在MySQL控制台中它不会检索状态名称。您确定您的关系被指定为
self::bellings\u TO
?在我看来,您可能在修复属性/关系名称冲突时更改了它。
ON (`status`.`id`=`t`.`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
}