boysfromthefactory/groundhog
Groundhog is a lightweight Laravel/PHP package from boysfromthefactory that simplifies recurring, repeatable work in your app. Drop it in, configure a few options, and keep repetitive logic clean, predictable, and easy to test. No extra dependencies.
php artisan migrate is enough; on an existing 0.1 install you must first run php artisan vendor:publish --tag="groundhog-migrations" and then php artisan migrate to run drop_groundhog_occurrence_index.groundhog_occurrences table — occurrences only exist inside a query result.groundhog.max_occurrences_per_series), then at the query scope that expands occurrences — that scope is where the JSON aggregation and driver branching live.RecurrenceNotSupported the moment you expand a query.series × occurrences in window, evaluated at query time. Treat the window as a required argument in your own service/repository layer rather than letting controllers pass arbitrary ranges through.groundhog.max_occurrences_per_series now bounds what one series generates for one query, counting only in-window occurrences. Set it high enough for your widest legitimate window.groundhog_occurrences or read materialized_until — both are gone, and groundhog.max_materialization_ahead no longer exists in config.max_occurrences_per_series, you'll get fewer rows than expected with no error. The save-time check is unchanged, so a series that validates fine can still be clipped at query time.materialized_until column in place. It's a no-op on fresh installs, so a green CI run tells you nothing about a production upgrade.groundhog_occurrences, they need rewriting against the expanded query.RecurrenceNotSupported is thrown at query time, not at boot or at save. Wrap expansion in a test that runs against your production driver, not just SQLite.How can I help you explore Laravel packages today?