0

这是我第一次在 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::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`);

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

按预期工作,我不知道如何在 Yii 中修复它。

4

1 回答 1

0

当你窥视时$moduleAR->status,你会得到整个 Status 模型实例,而不是它的 id。因此,请继续查看该实例:

$moduleAR->status->name.

这就是 ActiveRecord 魔法的用途;)

相反,如果你有 Status 模型,你应该有一个这样的关系:

'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
}
于 2013-08-16T22:28:36.750 回答