Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Chiusa Adatta ai principianti
#8,588 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
88/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
laravel, php
Ambito
api, backend

Direzione di ricerca

Inizia da ApiPlatform\Laravel\Eloquent\Filter\OrFilter::apply() e confronta la gestione dei suoi input con FilterQueryExtension::apply(). Riproduci il problema con uno e più valori di tags, quindi verifica che entrambe le richieste eseguano correttamente il filtro senza l’errore foreach.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.

Lingua principale
PHP
Stelle
2.6k
Fork
984
Merge medio
1g 17h
PR unite (30g)
84

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di api-platform/core

Tutte le issue di api-platform/core

Issue simili

Altre issue su PHP

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.