@cat_crash

Как сделать динамические атрибуты модели Yii2?

Дорогой вселенский разум, помоги мне решить задачу:
Имеется Yii2 и прикрученная модель данных через mongodb\ActiveRecord
Хочу дать людям свободу действий, чтоб через простенький web интерфейс они могли добавлять записи со своими парами key->value
Ограничения:
- Хранить в Mongo именно аттрибутами {$key}->{$value}, т.е. запихать в переменную предопределленную в модели $attributes - не решение проблемы
- Нет возможности перечислять все возможные значения $key в исходниках модели, т.к. нет предела людскому креативу
Интуитивно предполагаю что играться надо с __get, __set но пока результата не принесло. Или ругается что не определено свойство, либо возвращает пустые значения на все свойства (переопределяя их в __set)
P.s. Есть похожая тема на stackoverflow.com/questions/38356701/yii2-adding-a... (1й кейс) - но в моем случае реализовать почему то не получилось.
  • Вопрос задан
  • 1027 просмотров
Решения вопроса 1
dskripchenko
@dskripchenko
backend developer (Promo Interactive)
CREATE TABLE `storage` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `key` varchar(255) DEFAULT NULL,
  `value` text,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`,`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


public function __get($name)
    {
        try{
            return parent::__get($name); 
        }
        catch(Exception $e){
            $sql = 'SELECT `s`.`value` FROM `storage` AS `s` WHERE `s`.`user_id` = :uid AND `key` = :key ';
            return Yii::$app->db->createCommand($sql)->bindValues([
                ':uid' => $userId, 
                ':key' => $name
            ])->queryScalar();
        }
    }


public function __set($name, $value)
    {
        try{
            parent::__set($name, $value); 
        }
        catch(Exception $e){
            if($this->$name){
                $sql = 'UPDATE `storage` AS `s` SET `s`.`value` = :value WHERE `s`.`key` = :key AND `s`.`user_id` = :uid ';
            }
            else{
                $sql = 'INSERT INTO `storage` (`user_id`,`key`,`value`) VALUES (:uid,:key,:value)';
            }
            Yii::$app->db->createCommand($sql)->bindValues([
                ':value' => $value,
                ':key' => $name,
                ':uid' => $userId 
            ])->execute();
        }
    }


$userId идентификатор нужного пользователя
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы