How to use IN operator with a GET request


(Alberto Favaro Vr) #1

The documentation of Yii2 REST Web Services explain that we can filter the searched collection through query params passed via URL in a GET HTTP request.

From doc: "Addionally, you can sort collections like localhost/users?sort=email or localhost/users?sort=-email. Filtering collections like localhost/users?filter[id]=10 or localhost/users?filter[email][like]=gmail.com could be implemented using data filters"

My question is how to use query params for an IN condition?

The IN condition is supported by data filter class of the framework but It does not work as I am doing it. I tried these:

  • localhost/api/v1/users?filter[id][in][]=1,2,3 (return empty response)

  • localhost/api/v1/users?filter[id][in]=[1,2,3] (return error message ‘Operator “in” requires multiple operands.’)

…and other ways same situation


(Alirz23) #2

query params should map to yii/db/Query::where signature


// try this

localhost/api/v1/users?filter[id][]=1&filter[id][]=2&filter[id][]=3


(Alberto Favaro Vr) #3

But you not use IN operator in the query params. Why?


(Alirz23) #4

you don’t need to explicitly use in operator if you doing a match against an array yii will convert it into an in query see the example below

http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html#hash-format


(Alberto Favaro Vr) #5

OK but if the framework in the DataFilter class has the following operators why they are not used in this case?




    /**

     * @var array maps filter condition keywords to validation methods.

     * These methods are used by [[validateCondition()]] to validate raw filter conditions.

     */

    public $conditionValidators = [

        'AND' => 'validateConjunctionCondition',

        'OR' => 'validateConjunctionCondition',

        'NOT' => 'validateBlockCondition',

        '<' => 'validateOperatorCondition',

        '>' => 'validateOperatorCondition',

        '<=' => 'validateOperatorCondition',

        '>=' => 'validateOperatorCondition',

        '=' => 'validateOperatorCondition',

        '!=' => 'validateOperatorCondition',

        'IN' => 'validateOperatorCondition',

        'NOT IN' => 'validateOperatorCondition',

        'LIKE' => 'validateOperatorCondition',

    ];



In each case thank you it work!