我有两个与一对一关系直接相关的表。一个是标准的Yii2用户表(为清楚起见,这里是缩写字段列表),另一个是包含user_id的员工表。如何创建一个全局可访问的变量(以及访问员工ID的实际代码),我可以在我的应用程序中的任何位置使用该变量,它将为我提供登录用户的员工ID以及如何调用该变量?我希望我可以说我已经尝试了一些东西,但不幸的是我对Yii2相对较新,并且不知道从哪里开始这样的全局变量。谢谢你的帮助。
用户表:
ID
用户名
密码
等
员工表:
ID
user_id(与用户表一对一关系)
员工模型:
<?php
namespace frontend\models\base;
use Yii;
/**
* This is the base model class for table "employee".
*
* @property integer $id
* @property integer $user_id
*
* @property \common\models\User $user
*/
class Employee extends \yii\db\ActiveRecord
{
public function rules()
{
return [
[['user_id', 'required'],
[['user_id'], 'integer'],
[['user_id'], 'unique']
];
}
public static function tableName()
{
return 'employee';
}
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'user_id' => Yii::t('app', 'User ID'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(\common\models\User::className(), ['id' => 'user_id']);
}
}
答案 0 :(得分:4)
一种非常简单的方法是使用$ param array
您最初可以在
中配置默认值your_App\config\param.php
并使用
进行访问\Yii::$app->params['your_param_key']
期待您的员工模式(对我而言)您不需要全局变量,您只需使用getUser
$myUser = Employee::user();
但您需要使用
指定的参数 \Yii::$app->params['my_user'] = Employee::user();
或用户
\Yii::$app->params['my_user'] = Yii::$app->user->id
或用于从表
中检索与实际用户相关的模型$myEmpModel = Employee::find()->where['user_id' => Yii::$app->user->id]->one();
答案 1 :(得分:1)
我认为正确的方法是在User
模型中使用关系。第一种方法是与activerecord的正确关系,第二种方法将使用上面定义的关系获得id。所以您将在用户模型中添加这些方法:
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployee()
{
return $this->hasOne(Employee::className(), ['user_id' => 'id']);
}
public function getEmployeeId()
{
return $this->employee ? $this->employee->id : NULL; // set to NULL or anything you expect to be if record is not found
}
然后你可以在应用程序的任何地方这样调用它:
$employee_id = Yii::$app->user->identity->employeeid;
这只适用于User模型,因为它实现了Identity,否则你需要首先实例化模型类,让我们这样说:
$user_id = 5; // 5 is id of user record in DB
$user = User::findOne($user_id);
$employee_id = $user->employeeid;
// or using first of 2 relations ...
$employee_id = $user->employee->id;