Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

[Laravel] OrFilter throws when an array query parameter has exactly one value

已关闭 适合新手
#8,588 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
88/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
laravel, php
领域
api, backend

调研方向

从 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[]=2 works.
  • 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

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

api-platform/core 的其他 Issue

查看 api-platform/core 的全部 Issue

相似的 Issue

更多 PHP Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。