kotcich
@kotcich
Я скучный.

Как фильтровать выборку значений из таблицы в REST Yii с помощью других полей(не только id)?

Есть url вида: back.ru/rest/10
По ней я получу юзера с id 10.
Но как мне получить юзера с именем равным Петя к примеру?
Ну то есть, что бы ссылка выглядела вот так: back.ru/rest/?name=some_name или типо того. Это возможно вообще в rest yii?

Мой контроллер:

<?php
namespace backend\controllers;

use yii\rest\ActiveController;
use backend\models\Test;

class RestController extends ActiveController
{
    public $modelClass = Test::class;

    public function checkAccess($action, $model = null, $params = [])
    {
        return true;
    }

    public function behaviors() {
        return [
            'contentNegotiator' => [
                'class' => \yii\filters\ContentNegotiator::class,
                'formatParam' => '_format',
                'formats' => [
                    'application/json' => \yii\web\Response::FORMAT_JSON,
                    'xml' => \yii\web\Response::FORMAT_XML
                ],
            ],
        ];
    }
}


Моя модель:

<?php
namespace backend\models;

class Test extends \yii\db\ActiveRecord
{
    public function rules()
    {
        return [
            [['name', 'age'], 'required'],
            ['name', 'string'],
            ['age', 'integer'],
        ];
    }
}
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
@Absolutus_Deo
Вы наследуетесь от ActiveController, что создает методы из коробки в методе actions

public function actions()
    {
        return [
            'index' => [
                'class' => 'yii\rest\IndexAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'view' => [
                'class' => 'yii\rest\ViewAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'create' => [
                'class' => 'yii\rest\CreateAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'scenario' => $this->createScenario,
            ],
            'update' => [
                'class' => 'yii\rest\UpdateAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'scenario' => $this->updateScenario,
            ],
            'delete' => [
                'class' => 'yii\rest\DeleteAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'options' => [
                'class' => 'yii\rest\OptionsAction',
            ],
        ];
    }


Так, что запрос по типу back.ru/rest/10 - выводит детальную инфу по записи, а именно ActionView

Для того, что бы вам сделать фильтрацию такого вида как вы написали необходимо переопределить метод index или view в зависимости от того в котором нужно фильтровать, можна сделать с помощью callback.
'dataFilter' => [
                    'class' => 'yii\data\ActiveDataFilter',
                    'searchModel' => 'path/To/Search,
                ],

В этом случае вы сохраните возможность фильтровать за дефолтом как сделано в YII2.

В вашем же случае можно сделать так, переопределить prepareDataProvider(), а в самом методе:

$searchModel = new \app\models\SearchModel();    
return $searchModel->search(\Yii::$app->request->queryParams);


Если детально, то:
Можно переопределить prepareDataProvider для действия index.
public function actions()
        {
            $actions = parent::actions();
            $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];

            return $actions;
        }

public function prepareDataProvider()
        {
            $searchModel = new \app\models\SearchModel();
            $dataProvider = $searchModel->search(\Yii::$app->request->queryParams);
            return $dataProvider;
        }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы