[Laravel] OrFilter throws when an array query parameter has exactly one value
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
调研方向
从 ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply() 开始,将其输入处理与 FilterQueryExtension::apply() 进行比较。使用一个和多个 tags 值重现该问题,然后验证两个请求都能成功进行筛选,且不会出现 foreach 错误。
由索引模型根据 Issue 内容生成。
描述
API Platform version(s) affected: 4.3.19
Description
ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply() always iterates its $values argument with foreach ($values as $value).
ApiPlatform\Laravel\Eloquent\Extension\FilterQueryExtension::apply(), flattens a single-element list array down to a scalar before calling any filter:
// most eloquent filters work with only a single value
if (\is_array($values) && array_is_list($values) && 1 === \count($values)) {
$values = current($values);
}
That's true for most filters, which take a single value directly. It isn't true for OrFilter, which always expects an array to iterate. So a QueryParameter using OrFilter throws the moment a request supplies exactly one value for the array-typed parameter, instead of filtering on it.
How to reproduce
'tags' => new QueryParameter(
schema: ['type' => 'array', 'items' => ['type' => 'integer']],
filter: new OrFilter(new EqualsFilter),
property: 'tag_id',
),
GET /books?tags[]=1&tags[]=2works.GET /books?tags[]=1(a single value) throws:
ErrorException: foreach() argument must be of type array|object, string given
at vendor/api-platform/laravel/Eloquent/Filter/OrFilter.php:36
Possible Solution
Normalize the input before iterating in ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply():
return $builder->where(function (Builder $builder) use ($values, $parameter, $context): void {
foreach (\Illuminate\Support\Arr::wrap($values) as $value) {
$this->filter->apply($builder, $value, $parameter, ['whereClause' => 'orWhere'] + $context);
}
});
rather than relying on every caller of FilterQueryExtension to never send OrFilter a single value.
- 主要语言
- PHP
- 星标
- 2.6k
- 派生
- 989
- 平均合并
- 2 天 1 小时
- 30 天内合并 PR
- 104
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
api-platform/core 的其他 Issue
-
JSON:API: resource schemas (`*.jsonapi`) have `properties` but no `type: object`可能已有人在做 @ousamabenyounes 于 1 天前认领。 未关闭
难度 2/5 1 小时以内 新手友好度 80/100
api-platform/core#8701 ·
维护者通常 1 天内回复
-
JSON:API: `JsonApiCollectionBaseSchemaNoPagination` declares `data` as `type: array` without `items`未关闭
难度 2/5 1-3 小时 新手友好度 82/100
api-platform/core#8699 ·
维护者通常 1 天内回复
-
api:openapi:export --spec-version=3.0.0 outputs `webhooks`, which is invalid in OpenAPI 3.0可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 2/5 1-3 小时 新手友好度 72/100
api-platform/core#8690 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 85/100
api-platform/core#8680 ·
维护者通常 1 天内回复
-
难度 3/5 1-2 天 新手友好度 68/100
api-platform/core#8725 ·
维护者通常 1 天内回复
查看 api-platform/core 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 92/100
维护者通常 1 天内回复
-
Authentication / Authorization Feature: Volunteer
难度 2/5 1-3 小时 新手友好度 85/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 64/100
WordPress/mcp-adapter#399 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 80/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 85/100
freescout-help-desk/freescout#5750 · 1 条评论 ·
维护者通常 1 天内回复