Всем Привет. Подскажите как можно и лучше сделать валидацию данных?
1. Есть две Таблицы. В одной есть «назначения» во второй присвоенные категории. Связываются они по id. Мне необходимо поле первой Таблицы проверить по двум полям второй Таблицы. Можно ли сделать такую валидацию? Не нашёл подобных примеров в документации.
2. Планирую сделать это соединив две таблицы в одну через leftjoin и через функцию валидация провалилировать данные.
Если нет реализации такой валидация в rules - могли бы скинуть как в yii2 подключать связанную таблицу через left join. Нет возможности порыться в документации. Интернет плохо ловит.
Про это знаю, но мне немного не это нужно. Здесь идёт работа с двумя моделями одновременно... В моем случае модель одна. Но необходимо валидировать данные одной модели по другой. Не знаю как правильно описать, но попробую.
Выбираем в таблице назначений idшник Таблицы судейских категорий. По этому айдишнику надо считать id судьи. По нему нужно смотреть в таблице назначений сколько раз этот судья назначался. Если больше 6 раз за 1 год и 2 месяца, то выдаём ошибку. Так же надо провалидировать и другие параметры, но по аналогии сделаю легко.
В базе MySQL решить это можно просто. Соединить две Таблицы в одну через left join и уже через where выбрать судью и посчитать через count().
slo_nik, всё таки не могу разобраться... У меня две таблицы. Связи через модели имеются ($this->judgeComitet->id)
Назначения Категории
1. Находим в таблице выбранного судью для проверки ($this->judgeComitet->judge_id).
2. Далее мне нужно получить все id таблицы judge_comitet выбранного судьи и его комитетами для проверки по всем категориям судьи.
3. Посчитаем все назначения текущего судьи. Если их больше 6 - выдаём ошибку
slo_nik, Есть. Подскажите, пожалуйста, как можно через связи получить все данные например судьи (judge_id)? Если я делаю
$judgeID = $this->judgeComitet->judge_id, то получаю только id текущего судьи. А мне нужно все занчения колонки id выбранного судьи... Для меня правда пока что это ещё сложно. Начал изучать только пару недель назад
slo_nik, точнооо((( А подскажите ещё такой момент. Теперь я получаю данные по $judgeComitets = $this->judgeComitets;
В результате выводится нужный массив данных из таблицы "judge_сomitet". Правильно ли я понял, что теперь нужно перебрать Массив через foreach? Либо тоже есть возможность вернуться в таблицу appointment и по полученным массиву найти данные?
и в массиве у меня получилось из-за связи hasMany дублирование массива.
Ещё раз попробую объяснить... У меня связь с таблицей должна быть hasOne. Так как у одного назначения может быть одна категория. У меня проблема была не в этом. Я нахожу через связь hasOne id выбранной категории
$judgeComitets = $this->judgeComitet->judge_id; //ищем id судьи у выбранной категории судьи.
Затем мне надо по judge_id найти все категории в таблице"judge_сomitet" Например (Ворожцова Елена 1 категория, Oriental, Ворожцова Елена, 3 категория, Bollywood... ). Далее нужно найти в списках назначений сколько раз был назначен судья. Но искать нужно по id комитету (judge_сomitet_id), так как id судьи мы здесь не заносим. Вот такая сложная схема...
Идеально присоединить таблицу и через where выбрать судей по текущему id ($this->judgeComitet->judge_id) посчитать сколько таких сначений через count? Может быть так лучше?
Максим Ворожцов, никакого дублирования массива не произошло. Посмотрите внимательно, для сравнения выведите массив любой другой модели, там будет два массива с атрибутами.
slo_nik, всё-таки не получилось реализовать по вашему методу... сделал вот так
Получилось сложно и много, но я не знаю как по-другому сделать проще( Спасибо за помощь. Надеюсь когда-то разберусь
public function getDateTo($dateCorretc)
{
$date = date_create(Yii::$app->formatter->asDate('now', 'php:Y-m-d'));//Создаем дату для рассчёта срока
$date = date_modify($date, $dateCorretc);//Прибавляем дату к текущей
return Yii::$app->formatter->asDate($date, 'php:Y-m-d');
//return $dateTo = strtotime($date);
}
public function validateMaxCountApp()
{
$AppointmentCount = Appointment::find()
->select('created_at')
->where(['>=','created_at',strtotime(self::getDateTo('- 1 year 2 month'))])//За период
->innerJoinWith('judgeComitet')
->select('judge_id')
->where(['judge_id'=>$this->judgeComitet->judge_id])//У выбранного судьи
->asArray()
->count();
$appCountToYear = 6; //Максимальное кол-во назначений за 1 год и 2 месяца
//Если назначений больше, чем $appCountToYear, тогда ошибка
if ( $AppointmentCount > $appCountToYear) $this->addError('*', 'Судья не может быть назначен больше '.$appCountToYear.' раз за 1 год и 2 месяца!');
//if ( $appCountToYear < 2) $this->addError('*', 'Судья не может быть назначен два года подряд'.$appCountToYear.'на одно и тоже событие!');
}