Yii从Yii :: app-> user访问关系数据

The*_*fNL 2 php yii

我想知道是否有可能或者是否有更简单的方法来做到这一点.

在许多页面上,我想使用关系数据,现在我使用它的每个页面都放置以下代码:

<?php
    if(!Yii::app()->user->isGuest){
        $user = User::model()->findByPk(Yii::app()->user->id);
    }
?>
Run Code Online (Sandbox Code Playgroud)

所以我可以在视图中使用以下内容:

$user->account->name
Run Code Online (Sandbox Code Playgroud)

显示当前用户相关帐户的名称

如果我能做到以下几点会很好:

Yii::app->user->account->name
Run Code Online (Sandbox Code Playgroud)

设置状态不是我正在寻找的,因为它不仅是我想要使用的帐户名,而且我不想为我可能想要使用的所有关系数据添加状态.

 Solution

 |
 |
 |
 V
Run Code Online (Sandbox Code Playgroud)

我结合了两个答案的好处来创建以下内容:

class WebUser extends CWebUser {
private $_user;

public function getAccount(){
    if(!$this->isGuest && (!isset($this->_user) || Yii::app()->user->id != $this->_user->id)){
        $this->_user = User::model()->findByPk(Yii::app()->user->id);
    }
    if(!empty($this->_user)){
        return $this->_user->account;
    } else {
        return false;
    }

  }
}
Run Code Online (Sandbox Code Playgroud)

所以现在我可以使用以下内容:

Yii::app()->user->account->name
Run Code Online (Sandbox Code Playgroud)

如果用户已登录并且没有存储数据或用户具有不同的id,则上述方法检索数据.

将它放在组件中,并确保将Afnan谈论的部分添加到配置(main.php)

我接受Afnan的答案,因为它对我帮助最大(我需要知道的部分)

Afn*_*hir 6

嗯,我不知道它是否是最好的解决方案,但我通常通过扩展做这样的事情 CWebUser

我要做的是在扩展的Components文件夹中创建文件 CWebUser

class CWebUserExtend extends CWebUser
{
    /**
     *
     * @return the type of user based on forien key of UserType
     */
    public function getUserAccname()
    {
        $user = User::model()->findByPk(yii::app()->user->id);
        if ($user === null)
            return 'error';            
        else
            return $user->account->name;            
    }
}
Run Code Online (Sandbox Code Playgroud)

并在main.php文件中以下列方式修改'User'索引

'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
                        'class'=>'CWebUserExtend',//class that extends CWebUser
        ),
Run Code Online (Sandbox Code Playgroud)

这可以让你做点什么

Yii::app()->user->getUserAccname();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你