【问题标题】:Yii accessing relational data from Yii::app->userYii 从 Yii::app->user 访问关系数据
【发布时间】:2013-02-27 23:21:29
【问题描述】:

我想知道这是否可行或是否有更简单的方法。

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

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

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

$user->account->name

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

如果我能做到以下几点就好了:

Yii::app->user->account->name

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

 Solution

 |
 |
 |
 V

解决方案

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

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

  }
}

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

Yii::app()->user->account->name

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

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

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

【问题讨论】:

  • 请修复返回 $this->_user->account;返回 $this->_user;

标签: php yii


【解决方案1】:

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

我要做的是在扩展 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;            
    }
}

并在 main.php 文件中按以下方式修改“用户”索引

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

这会让你做一些事情

Yii::app()->user->getUserAccname();

希望对你有帮助

【讨论】:

    【解决方案2】:

    类似于 Afnan 的回答,但只是我的 2 美分。我像 Afnan 建议的那样扩展了 webuser 类,但也有一个 account 模型,用于数据库访问和模型规则。我通过在我的ExWebUser 类上使用一个函数来访问它:

    public function getAccount(){
        return Account::model()->findByPk($this->id);
    }
    

    这使我可以使用Yii::app()-&gt;user-&gt;account-&gt;name 访问它,如果您有很多事情要做,这比每次操作都有一个方法要干净得多。

    附言
    这显然可以通过将结果缓存在扩展类的私有变量中并可能在init() 方法上预加载来大大改善。

    【讨论】:

    • 在这种情况下无法在 Init 中预加载,因为在 init 时没有用户登录,我需要登录用户的关系数据。无论如何,谢谢您的回答,我认为我目前的解决方案非常简洁。
    【解决方案3】:

    感谢您的帮助!我刚刚注意到我必须将您的代码更改为:

    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;
        } else {
            return false;
        }
    
      }
    }
    

    我只返回$this-&gt;_user 来访问我的用户属性,例如Yii::app()-&gt;user-&gt;account-&gt;name

    【讨论】:

    • 通过将函数名称更改为 getInfo() 你应该可以使用 Yii::app()->user->info->name 以防你不喜欢使用“帐户”。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2011-07-08
    • 2012-06-17
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多