$judgeComitets = $this->judgeComitets;
$this->judgeComitets->appointments->judge_comitet_id;
public function getAppointments()
{
return $this->hasMany(Appointment::className(), ['judge_comitet_id' => 'id']);
}
public function getJudgeComitet()
{
return $this->hasOne(JudgeComitet::className(), ['id' => 'judge_comitet_id']);
}
$judge_comitetArray = JudgeComitet::find()->select('id')->where(['judge_id'=>$judgeID])->asArray()->all();
1) валидатор unique, проверяете по id или ещё по какому-то параметру.
2) валидатор range.
3) в форме не показывать тех судей, у которых срок действия категории истёк.
4) опять же, перед выводом формы проверять этот параметр и не показывать в форме.
....
Это первое, что пришло на ум, чтобы не писать кучу запросов в validator-ах.
Делайте сразу с таблицами и связями, меньше мороки будет с валидацией.
public function rules()
{
return [
[['id_event', 'comitet_id', 'id_judge'], 'required'],
[['id_event', 'comitet_id', 'id_judge', 'created_at', 'updated_at'], 'integer'],
[['status'], 'string'],
[['status'], 'default', 'value' => '0'],
[['id_event'], 'exist', 'skipOnError' => true, 'targetClass' => Event::className(), 'targetAttribute' => ['id_event' => 'id']],
[['id_judge'], 'exist', 'skipOnError' => true, 'targetClass' => Judge::className(), 'targetAttribute' => ['id_judge' => 'id']],
[['comitet_id'], 'exist', 'skipOnError' => true, 'targetClass' => Comitet::className(), 'targetAttribute' => ['comitet_id' => 'id']],
['id_event', 'validateMaxJugle'],
//['id_judge', 'validateActive'],
['id_judge', 'validateDateOpen'],
[['id_event','comitet_id', 'id_judge'], 'unique', 'targetClass' => '\backend\models\Appointment', 'targetAttribute' => ['id_event', 'comitet_id', 'id_judge'], 'message' => 'Такое назначение уже существует!'],
];
}
$this->addError('', 'У выбранного судьи нет судейской категории выбранного комитета!');
$this->addErrors('У выбранного судьи нет судейской категории выбранного комитета!');
public function validateDateOpen()
{
$dateToday = date("d-m-Y");//Текущая дата
//Если судья имеет категории, то проверяем на срок действия
if ( $judgeComitets = $this->idJudge->judgeComitets ) {
foreach ( $judgeComitets as $judgeComitet ) {
//Если у выбранного судьи имеется судейская категории выбранного комитета, то узнаём дату сдачи
if ( $judgeComitet->comitet_id == $this->comitet_id ) {
$dateFrom = $judgeComitet->date_from;//Считываем дату сдачи
$date = date_create($dateFrom);//Создаем дату для рассчёта срока
date_modify($date, '1 year 2 month');//Прибавляем дату к текущей
$dateToCategory = date_format($date, 'd.m.Y');//Форматируем дату
//Если срок лицензии закончился, то выводим ошибку!
if ( $dateToday>$dateToCategory ) {
$this->addError('id_judge', 'У выбранного судьи закончился срок действия судейской категории! Срок действия выбранной категории до: '.$dateToCategory.'!');
}
}
}
if ( empty($dateFrom) ) {
$this->addError('comitet_id', 'У выбранного судьи нет судейской категории выбранного комитета!');
}
}
}
public function validateMaxJugle()
{
//Посчитаем общее колличество назначений на текущее событие с учетом статуса "проверяется"
$aEventCount = Appointment::find()->where(['id_event' => $this->id_event,'status'=>'0','status'=>'1'])->count();
//Максимальное кол-во судей для назначения по текущеме рангу
$rangEvent = RangEvent::find()->where(['id' => $this->idEvent->id_rang_event])->one();
$maxJugle = $rangEvent->col_judge;
//Если назначений больше, то выдаем ошибку
if ($aEventCount > $maxJugle) {
$this->addError('id_event', 'На данное событие нельзя назначить больше '.$maxJugle.' судей!');
}
}
Я вывожу
и в массиве у меня получилось из-за связи hasMany дублирование массива.
Ещё раз попробую объяснить... У меня связь с таблицей должна быть hasOne. Так как у одного назначения может быть одна категория. У меня проблема была не в этом. Я нахожу через связь hasOne id выбранной категории
Затем мне надо по judge_id найти все категории в таблице"judge_сomitet" Например (Ворожцова Елена 1 категория, Oriental, Ворожцова Елена, 3 категория, Bollywood... ). Далее нужно найти в списках назначений сколько раз был назначен судья. Но искать нужно по id комитету (judge_сomitet_id), так как id судьи мы здесь не заносим. Вот такая сложная схема...
< b >GredVievДизайн связи