2016-12-24 9 views
1

У меня есть две таблицы, которые связаны непосредственно друг с другом. Одна из них - стандартная таблица пользователей Yii2 (сокращенный список полей здесь для ясности), а другая - таблица сотрудников, которая содержит user_id. Как создать глобально доступную переменную (и фактический код для доступа к идентификатору сотрудника), который я могу использовать в любом месте моего приложения, которое даст мне идентификатор сотрудника в журнале и как я могу назвать эту переменную? Хотел бы я сказать, что я пробовал несколько вещей, но, к сожалению, я относительно новичок в Yii2 и понятия не имею, с чего начать с глобальных переменных, подобных этому. Спасибо за любую помощь.Yii2 Как создать глобально доступную переменную, которая преобразует идентификатор пользователя в идентификатор сотрудника

пользователь таблица:
идентификатор
имя пользователя
пароль
т.д.

работник стол:
идентификатора
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']); 
} 
} 

ответ

1

Я считаю, собственно путь - использовать отношения в вашей модели User. Первый метод - это правильная связь с activerecord, вторая - идентификатором, использующим отношение, определенное выше. так Вы добавите эти методы в модели пользователя:

/** 
* @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_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; 
+0

Это предложение элегантно, просто и отлично работает для меня. Спасибо. – Marko

3

Самый простой способ состоит в использовании массива $ паров

Вы можете изначально конфиг значения по умолчанию в

your_App\config\param.php 

и доступ с использованием

\Yii::$app->params['your_param_key'] 

Глядя на модель Сотрудника (для мне) вам не нужен глобальный var, вы можете просто использовать getUser

$myUser = Employee::user(); 

но вам нужны параметры можно назначить с помощью

\Yii::$app->params['my_user'] = Employee::user(); 

или в пользовательском

\Yii::$app->params['my_user'] = Yii::$app->user->id 

или retrive модели, связанную с фактическим пользователем из таблицы

$myEmpModel = Employee::find()->where['user_id' => Yii::$app->user->id]->one(); 
+0

Спасибо! Но как будет выглядеть код для доступа к идентификатору сотрудника от зарегистрированного пользователя? – Marko

+0

обновите свой вопрос и добавьте ..модель сотрудника – scaisEdge

+0

Я опубликовал то, что я предполагаю, является частью модели сотрудника, которая вам нужна (удалите все ненужные коды для других функций). Если вам нужно больше, просто дайте мне знать. Вопрос был обновлен до того, чтобы включить разъяснение в запрос кода. Спасибо за вашу помощь. – Marko