Фильтрация коллекции по значению поля

Всё что касается построения API
Ответить
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Фильтрация коллекции по значению поля

Сообщение mclighter »

Добрый день!

Подскажите как сделать чтото вроде такого - http://localhost/API/v1/profiles?filter={cityId:'5'}
Чтобы в ответе были все профили у которых указан конкретный город с cityId=5
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Фильтрация коллекции по значению поля

Сообщение yiijeka »

Так же как и обычный index с GridView. Используйте searchModel. Можно ещё прописать метод:

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

 actionIndex($filter = null) 
{
$query->andWhere(['cityId' => $filter]); 
//...
} 
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Re: Фильтрация коллекции по значению поля

Сообщение mclighter »

спасибо, сделал так:

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

public function actionIndex($filter = null)
    {
        $modelClass = $this->modelClass;

        $filter =  json_decode($filter,true);

        if ($filter){
            return new ActiveDataProvider([
                'query' => $modelClass::find()->andWhere($filter),
            ]);
        } else {
            return new ActiveDataProvider([
                'query' => $modelClass::find(),
            ]);
        }
    }
 
теперь понимает запросы вида http://localhost/rest/profiles?fields=i ... ":1,"id":4}

Вообще ожидал что подобная возможность должна быть реализована на уровне фреймворка.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Фильтрация коллекции по значению поля

Сообщение yiijeka »

json создан был для js. И передаётся он обычно на серверный язык через POST... Поэтому Yii ничего не обязан реализовывать такого с коробки. Эта уже ваша хотелка странная.
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Re: Фильтрация коллекции по значению поля

Сообщение mclighter »

Я про то что любая реализация фильтрации для REST была бы не лишней, не обязательно json.

Например : http://localhost/API/cities?countryId=11 (фильтр городов по стране)
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Фильтрация коллекции по значению поля

Сообщение yiijeka »

Реализация есть. Используйте IndexAction c prepareDataProvider в вашем контроллере:

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

public function actions()
    {
        return [
            'filter' => [
                'class' => 'yii\rest\IndexAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'prepareDataProvider' => function($action) {
                        $modelClass = $action->modelClass;
                        return new ActiveDataProvider([
                                'query' => $modelClass::find()->where('country_id=:countryId', [':countryId' => $_GET['countryId']]),
                            ]);
                },
             // ...
             ],
Ответить