@stalkerxxl

Научите формировать filter в GridView к связанной модели?

И снова здравствуйте!
Подскажите (я бы даже сказал - НАУЧИТЕ!) решение такой задачи:
Есть таблице Order и есть таблице Portfolio
связь стандартная:
public function getPortfolio()
    {
        return $this->hasOne(Portfolio::class, ['id' => 'portfolio_id']);
    }

В GridView хочу выводить в фильтре именно те Portfolio, id которых присутствуют в колонке portfolio_id таблицы Order
На данный момент написал такой костыль в order/index.php
[
                'attribute' => 'portfolio_id',
                'headerOptions' => ['class' => 'col-md-1'],
                //'headerOptions' => ['width' => '50'],
                'format' => 'text',
                'filter' => Html::activeDropDownList($searchModel, 'portfolio_id', Portfolio::getNames(), // возвращаем ВСЕ портфели
                    ['class' => 'form-control', 'prompt' => 'Все']),
                'value' => 'portfolio.title'
            ],


в таблице Order - есть ордера на 2 портфеля из 5.. в dropdown - я вижу все 5 Портфелей..
Вот хочу понять сам принцип работы со связями.. доку читал - вроде все понятно.. но что именно делать - нет...
Я понимаю, что нужно создать метод в модели Order, который будет дергать все значения колонки portfolio_id и отдавать мне их в виде массива (id - portfolio.title)... Правильно?
Можно конкретный пример по данному случаю?
Просто в остальных моих таблицах - примерно такие же связи и задача будет повторяться (разными будут только названия связанных таблиц)..

Прошу строго не судить и не ржать =).. в 40 лет не так-то просто учить php и yii
  • Вопрос задан
  • 275 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
В gridView установите параметр 'filterModel' => $searchModel для всей таблицы.
Portfolio::getNames() что возвращает, только имена?
Я бы переписал параметры фильтра чуть по-другому.
[
                'attribute' => 'id_portfolio',
                'headerOptions' => ['class' => 'col-md-1'],
                'format' => 'text',
                'filter' => Portpholio::getAllPortfolio(),
                'value' => 'portfolio.title'
            ],

Сам метод getAllPortfolio() может выглядеть так
public static function getAllPortfolio()
    {
        return ArrayHelper::map(self::find()->orderBy(['name' => SORT_ASC])->all(), 'id', 'name');
    }

В поисковой модели запрос может выглядеть так(ещё добавить публичное свойство)
public $id_portfolio;

$query = Order::find()->with('portfolio');

$query->andFilterWhere('{{%portfolio}}.id' => $this->id_portfolio);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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