Динамическое создание свойств модели

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Динамическое создание свойств модели

Сообщение Sereja3578 »

Всем привет) Есть модели, например User, contracts, accounts, в моделях нужно динамически создавать и выводить (с фильтрами и сортировками) разные статистические поля, например balance, contracts_count, win_contracts_count и выводить их нужно в разных валютах, например balanceRub, balanceUsd, balanceEur, добавить эти поля в селект можно так
$query->select[] = 'some select AS balanceRub';
$query->select[] = 'some select AS balanceUsd';
$query->select[] = 'some select AS balanceEur';

Разумеется в цикле по валютам. Если поля будут в селекте по ним работают фильтры и прочее, то есть проблема динамического добавления в грид от части решена. Но в классе приходится писать
public balanceRub;
public balanceUsd;
public balanceEur;

и так далее, 100 полей, так как статистических колонок много и надо для каждой валюты свойство делать. Хочется сделать это как-то динамически, в цикле, но без использования dinamicModel, так как много переделывать. Типа перебирать в цикле массив по валютам и формировать свойства модели. На обычном php если попытаться задать значение не существующему свойству проблем не будет, оно создастся, а в yii падает exception, что такого свойства не существует. Помогите найти решение. Массив свойств не предлагать, так как тогда фильтры не будут работать.

Samdark, elisdn может подскажете? Спасибо)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Динамическое создание свойств модели

Сообщение ElisDN »

Sereja3578 писал(а): 2019.02.19, 08:49 Массив свойств не предлагать, так как тогда фильтры не будут работать.
Перепишите фильтры, чтобы работали с массивом.

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

[
    'label' => 'Balance ' . $curr,
    'attribute' => 'balance.' . $curr,
    ...
]
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Динамическое создание свойств модели

Сообщение someweb »

А в Yii необычный PHP что ли?)
Exception бросают методы __set() и __get() класса Component
Если вам точно нужны свойства, то записываете все в массив и перекрываете метод __get()

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

public function __get($name)
{
    if ($name === 'Наше св-во') {
        return значение_из_массива или null;
    } else {
        return parent::__get($name);
    }
}
Тогда свойства будут доступны на чтение через $model->property
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Ответить