• Yii2 3 таблицы связь многие ко многим в GridView::widget реализовать поиск?

    @Inviseble_Demon Автор вопроса
    padlyuck Успокоил что это как минимум близко к правде. Итоговое рабочее решение (Но оно мне не нравится ^_^ )

    attr_ - отсебятина дабы потом знать что это данные из связки с атрибутами.
    После attr_ указываем имя атрибута из таблицы object_fields
    getAttr - мой геттер тут ничего интересного все банально.


    В views указываем
    echo GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $dataFilter,
            'columns' => [
               .....
                [
                    'attribute' => 'attr_rooms',
                    'value' => function ($model) {
                        return $model->getAttr("rooms")->value;
                    }
                ],
               .....
            ],
        ]); ?>


    Далее все относится к модели

    Объявляем свойство attr_rooms
    class Objects extends \yii\db\ActiveRecord
    {
    ...
        public $attr_rooms;
    ...


    Так же добавляем правило
    ....
     public function rules()
        {
            return [
                    ....
                [['attr_rooms'], 'safe'],
                    ....
            ];
        }
    ....


    Чуть не забыл - указываем связь многие ко многим.

    public function getObjectFields()
        {
            return $this->hasMany(ObjectFields::className(), ['id' => 'object_attr_id'])
                ->viaTable(ObjectFieldValues::tableName(), ['object_id' => 'id']);
        }


    Ну и сам поиск (фильтр)
    public function adminFiltr($params)
        {
            $query = Objects::find()->joinWith('objectFields');
    
            $dataProvider = new ActiveDataProvider([
                'query' => $query,
            ]);
    
            if ($this->load($params))
                // регистрируем поиск по параметрам если они переданы, не пустые и начинаются с "attr_"
                // исключаем attr_ и используем название как название нашего атрибута из object_fields
                foreach ($params[$this->formName()] as $paramName => $paramValue) {
                    if (!empty($paramValue) and substr($paramName, 0, 5) == 'attr_') {
                        $paramName = substr($paramName, -5);
                        $query->andFilterWhere([
                            'object_field_values.value' => $paramValue,
                            'object_fields.name' => $paramName,
                        ]);
                    }
                }
    
            return $dataProvider;
        }


    Все это работает - НО реализация меня не устраивает - переделаю - отпишусь (если не забуду).
    Ответ написан
    Комментировать
  • Где хранить информацию до записи в БД?

    @Inviseble_Demon
    А в чем проблема переписать сессию при смене картинки ?
    На крайний случай в cookie пишите и меняйте там же js`ом
    Ответ написан
    Комментировать