Skip to content

Filtering validator broken when query resource by id #218

@danDanV1

Description

@danDanV1

Filtering validator does not read filter values when requesting resource by id.

Can be replicated using the demo-laravel-json-api.

by ID
http://demo-laravel-json-api.homestead/api/v1/posts/15?filter[title]=Voluptas perspiciatis

{
    "errors": [
        {
            "title": "Filter should contain only allowed values.",
            "source": {
                "parameter": "filter"
            }
        }
    ]
}

by index filter is recognized works as expected
http://demo-laravel-json-api.homestead/api/v1/posts?filter[title]=Voluptas perspiciatis

{
    "meta": {
        "page": {
            "current-page": 1,
            "per-page": 15,
            "from": 1,
            "to": 1,
            "total": 1,
            "last-page": 1
        }
    },
    "links": {
        "first": "http://demo-laravel-json-api.homestead/api/v1/posts?filter%5Btitle%5D=Voluptas+perspiciatis&page%5Bnumber%5D=1&page%5Bsize%5D=15",
        "last": "http://demo-laravel-json-api.homestead/api/v1/posts?filter%5Btitle%5D=Voluptas+perspiciatis&page%5Bnumber%5D=1&page%5Bsize%5D=15"
    },
    "data": [
        {
            "type": "posts",
            "id": "1",
            "attributes": {
                "created-at": "2018-08-17T22:50:11+00:00",
                "updated-at": "2018-08-17T22:50:11+00:00",
                "title": "Voluptas perspiciatis porro.",
                "slug": "quod-molestias-id-non-quidem-assumenda-itaque",
                "content": "Possimus optio nulla repellat. Sint laudantium dolores est ratione qui et. Sit fuga aut dicta ea numquam pariatur ut. Id velit veniam quibusdam voluptas sit qui.\n\nConsequatur nihil dolorum sit iusto ut delectus quaerat. Eos nihil porro molestiae nam nulla corporis fugiat voluptas. Modi explicabo atque repellendus quas dolor aut quia voluptates. Quidem quisquam accusantium veritatis eum architecto mollitia ducimus.\n\nNeque doloremque commodi ratione repellat debitis hic aperiam occaecati. Et eaque quidem voluptatum recusandae fugiat et sapiente minus.",
                "published-at": "2010-02-23T16:52:53+00:00"
            },
            "relationships": {
                "author": {
                    "links": {
                        "self": "http://demo-laravel-json-api.homestead/api/v1/posts/1/relationships/author",
                        "related": "http://demo-laravel-json-api.homestead/api/v1/posts/1/author"
                    }
                },
                "comments": {
                    "links": {
                        "self": "http://demo-laravel-json-api.homestead/api/v1/posts/1/relationships/comments",
                        "related": "http://demo-laravel-json-api.homestead/api/v1/posts/1/comments"
                    }
                },
                "tags": {
                    "links": {
                        "self": "http://demo-laravel-json-api.homestead/api/v1/posts/1/relationships/tags",
                        "related": "http://demo-laravel-json-api.homestead/api/v1/posts/1/tags"
                    }
                }
            },
            "links": {
                "self": "http://demo-laravel-json-api.homestead/api/v1/posts/1"
            }
        }
    ]
}

I want to filter by related model. For the sake of using demo-laravel-json-api, I'm just using the existing user model relation for proof of concept. But you can imagine appropriate scenario for filtering a has-many relationship.

Working example:
http://demo-laravel-json-api.homestead/api/v1/posts?include=author&filter[user.name]=Fabian

Using a custom filter:

        if ($filters->has('user.name')) {
            $query->with(['author' => function ($related) use ($filters) {
                $related->where('name', 'like', '%' . $filters->get('user.name') . '%');
            }]);
        }

Works as expected.
-Returns all posts and includes only user (author) record for Fabian.

Issue is querying by record ID, filters aren't recognized. Filters are valid as established in previous examples.
http://demo-laravel-json-api.homestead/api/v1/posts/15?include=author&filter[user.name]=Fabian

{
    "errors": [
        {
            "title": "Filter should contain only allowed values.",
            "source": {
                "parameter": "filter"
            }
        }
    ]
}

How to implement filtering when fetching record by ID?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions