Laravel: WHERE-Bedingungen mit dem Eloquent QueryBuilder gruppieren

Wie kann man eigentlich in Laravel Where-Bedingungen Gruppieren, wenn man zum Beispiel mehrere AND Bedingungen mit einer OR Bedingung Verknüpfen will?

Es gibt zwar die whereNested() Methode, die führt aber auf die falsche Fährte.

Man muss einfach das ganz normale where() oder orWhere() verwenden!

Aber da die Laravel Dokumentation leider kein einfach abzuschauendes Beispiel her gibt, zeige ich es euch daher hier:

<?php

// ... Davor ...

/*
 * Opa erzählt mal wieder, wie früher alles besser war.
 * Und möchte die Tage wissen, an denen er damals zu seiner
 * Schulzeit beide Wege zur Schule bergauf und bei Schnee und Regen
 * gegangen ist.
 */

$tageAnDenenDieWeltInOrdnungWar = Tage::query()
    ->where(static fn (Builder $query) => $query
        ->where('schulweg_steigung_hinweg', '>', 0)
        ->where('schulweg_steigung_rueckweg', '>', 0)
        ->where(static fn (Builder $query) => $query
            ->where('wetter', '=', Wetter::SCHNEE)
            ->orWhere('wetter', '=', Wetter::REGEN)
        )
    })
    ->where('datum', '>=', $opa->einschulung_datum)
    ->where('datum', '<=', $opa->schulabschluss_datum)
    ->get();

/*
 * Der resultierende Query sieht dann etwa so aus:
 *
 *  SELECT * FORM `tage`
 *  WHERE (
 *          (`schulweg_steigung_hinweg` > 0 AND `schulweg_steigung_rueckweg` > 0)
 *          AND (`wetter` = 'Schnee' OR `wetter = 'Regen`)
 *      )
 *      AND `datum` >= '1933-01-04'
 *      AND `datum` <= '1939-09-01'
 */

Wie ihr seht, kann man an die Where-Methode eine Closure übergeben. In dieser Closure erhaltet ihr als einzigen Parameter einen Query-Builder an den ihr neue Bedingungen anfügen könnt. Die Bedingungen dieses Query-Builders werden in der übergeordneten Where-Bedingung dann mit Klammern umschlossen.