Yii中的关系数据库

时间:2012-04-26 22:56:05

标签: php yii gii yii-cactiverecord

所以我试过这个:http://www.yiiframework.com/wiki/285/accessing-data-in-a-join-table-with-the-related-models

基本上我有一个名为User的表,它与ToolAccess有关;通过User上的主键和ToolAccess上的userID字段进行相关。现在,工具访问与包含ToolID的表工具相关。现在这在Yii中不起作用,我似乎无法使用Yii从工具表中获取toolName字段。有关如何在Active Record上执行此操作的任何想法?

如果重要的话,我正在使用giix。

关系代码:

public function relations() {
    return array(
        'usergalleries' => array(self::HAS_MANY, 'Usergallery', 'userid'),
        'userinroles' => array(self::HAS_MANY, 'Userinroles', 'userid'),
        'userfailedlogin' => array(self::HAS_MANY, 'Userfailedlogin','userid'),
        // table name, relation, class name, relation key
        'toolaccess' =>array(self::HAS_MANY, 'Toolaccess','userid'),
        'tool' =>array(self::HAS_MANY, 'Tool','toolid')
    );
}

2 个答案:

答案 0 :(得分:1)

我假设您的架构看起来像这样:

User table             tool_access table          Tool table

id | other columns     userid | toolid            id | name | other columns

在这种情况下,User模型应该具有这样的关系(请注意,在这种情况下,工具将按名称排序):

public function relations() {
    return array(
        // other relations here...
        'tools' =>array(self::MANY_MANY, 'Tool', 'tool_access(userid,toolid)',
          'order' => 'tools.name',
        ),
    );
}

并且阅读工具的代码应如下所示:

$user = User::model()->with('tools')->findByPk($id);
foreach($user->tools as $tool) {
    echo $tool->name;
}

我在这里使用了tools的热切加载,主要是因为个人偏好,在这种情况下使用延迟加载应该也能正常工作。但是,只要您一次处理多个User记录,就应该首选加载。

答案 1 :(得分:0)

因此,如果我理解正确,用户和工具就会通过主键与多对多关系相关。

因此,您应该在User模型中定义此关系,如:

'tools' => array(self::MANY_MANY, 'Tool', 'tool_access(userid, toolid)', 'index' => 'id'),

这样,您可以在获取用户模型后访问该工具的名称

$user = User::model->findByPk($id);
$tools = $user->tools;
foreach ($tools as $tool)
{
    echo $tool->name;
}

我希望它适合你。