Ситуация, есть user, User на данный момент является магазин. В магазине есть сотрудники, нужно сделать так чтобы фиксировалась какие сотрудники в смене находятся. Я примерно реализовал, но как-то все громоздко получилось, и хотелось бы узнать, может есть какой-то альтернативный способ решение данной проблемы.
Сразу скажу что есть 3 таблиы это model User-хранятся юзеры, на данный момент это магазины, Personnel-хранится персонал, Shifts-хранятся смены.
Весь модели реализованы User
public function rules()
{
return [
[['username', 'auth_key', 'password_hash', 'email', 'created_at', 'updated_at', 'name'], 'required'],
[['status', 'created_at', 'updated_at'], 'integer'],
[['phone'], 'number'],
[['username', 'password_hash', 'password_reset_token', 'email'], 'string', 'max' => 255],
[['auth_key'], 'string', 'max' => 32],
[['name', 'telegram_chat_id', 'telegram_token', 'address'], 'string', 'max' => 50],
[['username'], 'unique'],
[['email'], 'unique'],
[['password_reset_token'], 'unique'],
[['otdel_id'], 'exist', 'skipOnError' => true, 'targetClass' => Otdel::className(), 'targetAttribute' => ['otdel_id' => 'id']],
];
}
...
/**
* @return string
*/
public function getNameSotrud()
{
return $this->last_name.' '.$this->name;//Показывает Фамилия Имя сотрудника
}
/**
* @return \yii\db\ActiveQuery
*/
public function getShifts()
{
return $this->hasMany(Shifts::className(), ['id_user' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getShiftSotrud()
{
return $this->hasMany(Personnel::className(), ['id' => 'id_sotrud'])->via('shifts');
}
public function getPersonnelAsString()
{
//Проверяем кто начал смену сегодня
$arr = \app\models\Shifts::find()->andWhere(['id_user' => $this->id])
->andWhere(['between', 'start', date('Y-m-d 00:00:00'), date('Y-m-d 23:59:59')])
->andWhere(['end' => '0000-00-00 00:00:00'])
->all();
$sotrud = ArrayHelper::map($arr, 'id', 'id_sotrud');//Получаем массив из данных
foreach ($sotrud as $key => $id_sotrud){
//Перебираем массив и выводим Фамилию Имя каждого сотрудника который имеется в массиве
$user = \app\models\Shifts::findOne(['id_sotrud' => $id_sotrud]);
return $user->idSotrud->nameSotrud;
}
}
Personnel
public function rules()
{
return [
[['last_name', 'name', 'phone'], 'required'],
[['action'], 'integer'],
[['last_name', 'name', 'shedule'], 'string', 'max' => 50],
[['job_duties'], 'string', 'max' => 86],
[['phone'], 'string', 'max' => 15],
];
}
Shitts
return [
[['start', 'end'], 'safe'],
[['id_sotrud', 'id_user'], 'integer'],
[['id_user'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['id_user' => 'id']],
[['id_sotrud'], 'exist', 'skipOnError' => true, 'targetClass' => Personnel::className(), 'targetAttribute' => ['id_sotrud' => 'id']],
];
/**
* @return \yii\db\ActiveQuery
*/
public function getIdUser()
{
return $this->hasOne(User::className(), ['id' => 'id_user']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getIdSotrud()
{
return $this->hasOne(Personnel::className(), ['id' => 'id_sotrud']);
}
Ну Detailview
use kartik\detail\DetailView;
<?= DetailView::widget([
'model' => $model,
'hover' => false,
'mode'=>DetailView::MODE_VIEW,
'striped' => false,
'attributes' => [
'email:email',
'address:text',
'phone',
'personnelAsString',
]
]) ?>
У меня только выходит одно значение