Фильтрация по связаному полю REST

Всё что касается построения API
Ответить
AbsolutusDeo
Сообщения: 2
Зарегистрирован: 2021.05.12, 16:42

Фильтрация по связаному полю REST

Сообщение AbsolutusDeo »

Всем доброго времени суток.)
Столкнулся с такой проблемой как фильтрация связаного поля в REST API.
По дефолтным значениям модели фильтрует все хорошо, но когда выполняю фильтрацию по связаному полю то выходит шляпа.
С екшена возвращаю обьект

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

DataProviderInterface
но

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

yii\rest\Serializer
просто добавляет связаное поле в массив,

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

    protected function serializeModel($model)
    {
        if ($this->request->getIsHead()) {
            return null;
        }

        list($fields, $expand) = $this->getRequestedFields();
        return $model->toArray($fields, $expand);
    }
логика по дефолту, для множества моделий то же самое.
Сама сортировка масива не подходит потому как слишком много данных приходит и PhP захлебнется, сейчас делаю join и сортировку по результирующей таблице.

Хотелось бы доставать связь прописаную в моделе и фильтровать уже по ней.
Нужен ваш хелп дорогие форумчане!
AbsolutusDeo
Сообщения: 2
Зарегистрирован: 2021.05.12, 16:42

Re: Фильтрация по связаному полю REST

Сообщение AbsolutusDeo »

Опишу как реализовал такую штуку.

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

    public function actions(){
        return ArrayHelper::merge(parent::actions(), [
            'index' => [
                'prepareSearchQuery' => function(ActiveQuery $query, $requestParams){
                    //Тут делаю joinLeft|right/ joinWith , в моем случае именно leftJoin + group by после сортировка

                    return $query;
                },
                'dataFilter' => [
                    'class' => 'yii\data\ActiveDataFilter',
                    'searchModel' => 'core\forms\search\ClientProject',
                    'attributeMap' => [
                    //Тут описал отношение полей к таблицам.(Штука скорее для фильтров)
                        'status' => SearchModel::tableName().'.status',
                    ],
                ],
            ]
        ]);
    }

attributeMap -> https://www.yiiframework.com/doc/api/2. ... Map-detail
Ответить