Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto Apto para principiantes
#8,588 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
88/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
laravel, php
Área
api, backend

Línea de trabajo

Comienza en ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply() y compara el manejo de sus entradas con FilterQueryExtension::apply(). Reproduce el problema con uno y varios valores de tags y, después, verifica que ambas solicitudes filtren correctamente sin el error de foreach.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
PHP
Estrellas
2.6k
Forks
982
Merge medio
1 d 19 h
PR fusionados (30 d)
67

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de api-platform/core

Todos los issues de api-platform/core

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.