ВАЛИДАЦИЯ la-haute-societe/yii2-save-relations-behavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

ВАЛИДАЦИЯ la-haute-societe/yii2-save-relations-behavior

Сообщение an.viktory@gmail.com »

Есть полезное расширение la-haute-societe/yii2-save-relations-behavior

Код: Выделить всё

 $group = new Group();
 $groups->users = [1,3];
 
 ....
  /**
     * @return \yii\db\ActiveQuery
     */
    public function getGroupUsers()
    {
        return $this->hasMany(GroupUsers::className(), ['group_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getUsers()
    {
        return $this->hasMany(User::className(), ['id' => 'user_id'])->via('groupUsers')->orderBy('surname');
    }
Данное равширение прекрасно сохраняет данные в связанной таблице если данные существуют, но если нет то пытается создать польователя и соотвественно ругается что пользотель не может быть создан т.к. не проходит валиацию. Навешивание кастомных правел не работает т.к. поле не публичное и не входит в список аттриутов модели и перехватвается самим расширением. Как быть если хочу чтобы мне валидация говорила что не могу добавить в группу пользователя который не существует.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: ВАЛИДАЦИЯ la-haute-societe/yii2-save-relations-behavior

Сообщение yiiliveext »

an.viktory@gmail.com писал(а): 2020.01.28, 18:15 Как быть если хочу чтобы мне валидация говорила что не могу добавить в группу пользователя который не существует.
Примерно так

Код: Выделить всё

public function __set($name, $value)
    {
        if (is_array($value) && in_array($name, ['users', 'anotherRelationName'])) {
            foreach ($value as $entry) {
                if (!is_array($entry)) {
                    $relation = $this->getRelation($name);
                    $modelClass = $relation->modelClass;
                    $related = $modelClass::findOne($entry);
                    if ($related === null) {
                        throw new \Exception("Invalid data in $name");
                    }
                }
            }
        }
        parent::__set($name, $value);
    }
Это нужно добавить в модель Group. Будет работать только с простыми ключами, с составными чуть сложнее будет реализация, но это вы уж как-нибудь сами. Ну и вместо исключения можете добавлять ошибку к модели или просто делать unset этого значения.
Последний раз редактировалось yiiliveext 2020.01.30, 10:24, всего редактировалось 1 раз.
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: ВАЛИДАЦИЯ la-haute-societe/yii2-save-relations-behavior

Сообщение an.viktory@gmail.com »

Спасибо попробуем)
Ответить