Skip to content

Conversation

@ruuddeenen
Copy link

@ruuddeenen ruuddeenen commented May 15, 2025

Summary by CodeRabbit

  • Nieuwe functies

    • Ondersteuning toegevoegd voor operator-gebaseerde filtering (zoals groter dan, kleiner dan, niet gelijk) en dynamische operatoren in filters.
    • Nieuwe mogelijkheid om te filteren op BelongsTo-relaties, inclusief geneste relaties.
    • Nieuwe configuratie-opties voor het converteren van relatie- en veldnamen (snake_case, camelCase) in query parameters.
    • Verbeterde ondersteuning voor Laravel 12.x en bijbehorende dependencies.
    • QueryBuilder ondersteunt nu generics voor betere type-inferentie.
  • Bugfixes

    • Correcte selectie van velden bij many-to-many-relaties.
    • Verbeterde verwerking van escape-tekens bij PostgreSQL.
    • Diverse kleine correcties in veldselectie en filtering.
  • Documentatie

    • Uitgebreide uitleg over nieuwe filtermogelijkheden en configuratie-opties.
    • Introductie visueel verbeterd met logo.
    • Links en voorbeelden geüpdatet naar versie 6.
  • Tests

    • Uitgebreide tests voor nieuwe filter- en veldselectiefunctionaliteit, inclusief edge cases en geneste relaties.
  • Chores

    • Updates aan dependency-versies en CI-workflows.
    • Opruimen van cache- en configuratiebestanden.

alipadron and others added 30 commits June 14, 2024 07:21
Add issue spatie#175 link in selecting-fields.md
Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.1.0 to 2.2.0.
- [Release notes](https://github.com/dependabot/fetch-metadata/releases)
- [Commits](dependabot/fetch-metadata@v2.1.0...v2.2.0)

---
updated-dependencies:
- dependency-name: dependabot/fetch-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…ependabot/fetch-metadata-2.2.0

Bump dependabot/fetch-metadata from 2.1.0 to 2.2.0
[DOCS] Update Frontend implementation with a new one
Update Documentation for php markdown
…turn-static

AllowedFilter should return static rather than self
* [FEAT] add filter by operators

* [TEST] add test cases for filter by operator

* [FEAT] add dynamic operator to filer by operators

* [TEST] test dynamic operator filter
…ifyEscapeChar. Fixes spatie#941 (spatie#968)

* Fix styling

* Removed explicit escaping for pgsql driver in FilterPartial#maybeSpecifyEscapeChar. Fixes spatie#941

Added mariadb driver in FilterPartial#maybeSpecifyEscapeChar phpdoc for param $driver. Also adjusted test in order to run with mariadb driver only if the installed version of illuminate/database dependency supports the driver.

* Fix styling

---------

Co-authored-by: Talpx1 <Talpx1@users.noreply.github.com>
Co-authored-by: Alex Vanderbist <alex.vanderbist@gmail.com>
Fixed bug where the include count fails if a relation has the word `Count` in it. For example, it fails for `billingCountry` by removing the word `Country` and trying to load a `billing` relation.
freekmurze and others added 21 commits February 19, 2025 08:07
Exclude `.github` folder and `.php_cs` from being included in composer installation
Enhance QueryBuilder with generics support for better type inference
update some links so point to v6 docs
Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/dependabot/fetch-metadata/releases)
- [Commits](dependabot/fetch-metadata@v2.3.0...v2.4.0)

---
updated-dependencies:
- dependency-name: dependabot/fetch-metadata
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…dependabot/fetch-metadata-2.4.0

Bump dependabot/fetch-metadata from 2.3.0 to 2.4.0
# Conflicts:
#	src/Filters/FiltersPartial.php
@coderabbitai
Copy link

coderabbitai bot commented May 15, 2025

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (2)
  • release
  • .release.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

Deze wijziging introduceert nieuwe filtermogelijkheden in de query builder, waaronder operator-gebaseerde filters en filtering op "belongs to"-relaties. Daarnaast zijn er configuratieopties toegevoegd voor naamgevingsconventies van relaties en velden. De testdekking is uitgebreid met nieuwe scenario's, en de afhankelijkheden zijn bijgewerkt voor compatibiliteit met Laravel 12.x. Documentatie en changelog zijn geüpdatet, en er zijn kleine aanpassingen gedaan aan de codeopmaak en importvolgorde.

Changes

Bestand(en) Wijzigingssamenvatting
.gitattributes, .gitignore, .phpunit.cache/test-results Nieuwe paden toegevoegd aan .gitattributes voor export-ignore; .php_cs.dist.php en .github worden nu genegeerd bij archiveren. .gitignore bevat nu .phpunit.cache. De testresultaten-cache .phpunit.cache/test-results is verwijderd.
.github/workflows/dependabot-auto-merge.yml GitHub Action dependabot/fetch-metadata geüpdatet van versie v2.1.0 naar v2.4.0.
.github/workflows/run-tests.yml Workflow herzien: triggers vereenvoudigd, matrix uitgebreid met PHP 8.4 en Laravel 12.*, testbench-versie toegevoegd, carbon-versie verwijderd, indeling en opmaak verbeterd.
CHANGELOG.md Changelog uitgebreid met details over versies 6.1.0 t/m 6.3.2, inclusief nieuwe features (generics, Laravel 12.x support, belongsTo filters, operator filters), bugfixes en documentatiewijzigingen.
README.md Introductie vervangen door een HTML-blok met klikbare logo-afbeelding en <h1>-titel; oorspronkelijke beschrijving verwijderd, badges en verdere inhoud ongewijzigd.
composer.json Afhankelijkheden bijgewerkt: Laravel 12.x en testbench 10.x ondersteund, pestphp/pest v3.7 toegevoegd, phpunit v11.5.3 toegevoegd, nunomaduro/larastan verwijderd.
config/query-builder.php Twee nieuwe configuratieopties toegevoegd: 'convert_relation_table_name_strategy' (voor relatie-tabelnaamconversie) en 'convert_field_names_to_snake_case' (voor automatische conversie van veldnamen naar snake_case).
database/factories/AppendModelFactory.php Importvolgorde aangepast; geen functionele wijzigingen.
database/factories/TestModelFactory.php Overtollige lege regel aan het einde verwijderd.
docs/_index.md Titel in front matter gewijzigd van "v5" naar "v6".
docs/advanced-usage/front-end-implementation.md Gewicht verhoogd van 3 naar 6; nieuwe Typescript/React-optie ("react-query-builder" van Carlos Garcia) toegevoegd.
docs/features/filtering.md Nieuwe documentatiesecties: operator-filters, belongsTo-filters en verbeteringen aan scope-filters (waaronder ondersteuning voor array-parameters en route model binding op andere kolommen dan id).
docs/features/selecting-fields.md Codevoorbeeld gewijzigd naar PHP-blok met inline commentaar; issue-verwijzing nu als klikbare link.
docs/introduction.md Documentatielinks bijgewerkt van versie 5 naar versie 6.
phpstan.neon.dist Larastan-extensiepad aangepast; twee boolean parameters verwijderd.
src/AllowedField.php Methode getInternalNames() accepteert nu optioneel een $snakeCase-parameter; indien true, worden namen geconverteerd naar snake_case.
src/AllowedFilter.php Nieuwe statische methoden: belongsTo (voor belongsTo-relatiefilters) en operator (voor operator-filters met FilterOperator enum). Diverse methodesignatures aangepast voor betere typeveiligheid (nullable, return type static).
src/Concerns/AddsFieldsToQuery.php Ondersteuning voor configurabele naamgevingsstrategieën bij relatie- en veldnamen toegevoegd in addRequestedModelFieldsToQuery en getRequestedFieldsForRelatedTable (nu met optionele $tableName).
src/Enums/FilterOperator.php Nieuwe enum FilterOperator toegevoegd met cases voor dynamische en standaard vergelijkingsoperatoren; bevat methode isDynamic().
src/Filters/FiltersBelongsTo.php Nieuwe filterklasse toegevoegd voor filtering op belongsTo-relaties, inclusief ondersteuning voor geneste relaties en meerdere waarden.
src/Filters/FiltersExact.php Volgorde van variabelen in closure-use gewijzigd; geen functionele impact.
src/Filters/FiltersOperator.php Nieuwe filterklasse toegevoegd voor filtering met verschillende operatoren (en dynamische operatoren), op basis van FilterOperator enum.
src/Filters/FiltersPartial.php Escape character wordt niet langer toegevoegd voor PostgreSQL (pgsql).
src/Filters/FiltersScope.php Gebruik van optional() vervangen door nullsafe-operator; aanname dat class-reflectie niet null is.
src/Includes/IncludedCount.php Suffix wordt nu alleen verwijderd als het daadwerkelijk een suffix is (einde van string), niet als het elders in de naam voorkomt.
src/Includes/IncludedRelationship.php Optioneel ophalen van tabelnaam voor relaties op basis van configuratie; kolomnamen worden nu gekwalificeerd geselecteerd.
src/QueryBuilder.php PHPDoc voorzien van generieke templateparameter TModel; static factory-methode for nu met type-annotatie voor betere type-inferentie.
tests/FieldsTest.php Nieuwe testcases toegevoegd voor JSON:API-naamconventies, snake_case-conversie, belongs-to-many-relaties, nested includes en correcte kolomkwalificatie in SQL.
tests/FilterTest.php Nieuwe tests voor custom filter query string, belongsTo-filters (en fouten), operator-filters (inclusief dynamisch), en uitgebreidere driver-ondersteuning voor escape characters.
tests/RelationFilterTest.php Nieuwe test toegevoegd voor uitschakelen van operator-filtering op gerelateerde modelvelden; import van FilterOperator toegevoegd.
tests/SortTest.php Overtollige lege regel verwijderd.
tests/TestCase.php Twee kolommen (full_name, salary) toegevoegd aan test_models; full_name aan related_models; registratie RayServiceProvider uitgecommentarieerd.
tests/TestClasses/Models/TestModel.php Nieuwe relatie nestedRelatedModels() toegevoegd als HasManyThrough via RelatedModel naar NestedRelatedModel.

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (23)
README.md (2)

1-7: Overweeg om externe links te beveiligen en in een nieuw tabblad te openen
Het <a>-element verwijst naar een externe site. Voor een betere gebruikerservaring en om veiligheidsrisico’s (zoals tabnapping) te voorkomen, voeg target="_blank" en rel="noopener noreferrer" toe.
Voorbeeld diff:

-    <a href="https://spatie.be/open-source?utm_source=github&utm_medium=banner&utm_campaign=laravel-query-builder">
+    <a href="https://spatie.be/open-source?utm_source=github&utm_medium=banner&utm_campaign=laravel-query-builder" target="_blank" rel="noopener noreferrer">

9-9: Controleren of de H1-structuur behouden blijft
De <h1> is nu onderdeel van een HTML-blok; verifieer in verschillende weergaves (GitHub, docs-site) dat deze nog steeds als kopniveau 1 wordt herkend en niet als gewone tekst.

src/Enums/FilterOperator.php (1)

15-18: Method isDynamic mist return-typehint
Om de code explicieter en type-veiliger te maken, voeg : bool toe aan de methode-signature:

-    public function isDynamic()
+    public function isDynamic(): bool
docs/introduction.md (3)

26-26: Verwijder de dubbele punt na ‘like’
Typografisch is het beter om de dubbele punt te schrappen bij “features like”:

-[Read more about filtering features like: partial filters, exact filters, scope filters, ...]
+[Read more about filtering features like partial filters, exact filters, scope filters, ...]
🧰 Tools
🪛 LanguageTool

[typographical] ~26-~26: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...`` [Read more about filtering features like: partial filters, exact filters, scope f...

(RP_COLON)


38-38: Verwijder de dubbele punt en herziet formulering
Pas “include features like: including nested relationships” aan naar een vloeiender Engels, bijvoorbeeld:

-[Read more about include features like: including nested relationships, including relationship count, ...]
+[Read more about include features such as nested relationship inclusion, including relationship count, ...]
🧰 Tools
🪛 LanguageTool

[uncategorized] ~38-~38: This verb may not be in the correct form. Consider using a different form for this context.
Context: ...ir posts loaded ``` [Read more about include features like: including nested relatio...

(AI_EN_LECTOR_REPLACEMENT_VERB_FORM)


50-50: Verwijder de dubbele punt na ‘like’
Voor consistentie in de documentatie, verwijder de dubbele punt bij “sorting features like”:

-[Read more about sorting features like: custom sorts, sort direction, ...]
+[Read more about sorting features like custom sorts, sort direction, ...]
🧰 Tools
🪛 LanguageTool

[typographical] ~50-~50: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ... ``` [Read more about sorting features like: custom sorts, sort direction, ...](http...

(RP_COLON)

docs/advanced-usage/front-end-implementation.md (1)

14-14: Consistente lijststijl: voeg dubbele punt toe
Voor uniformiteit met andere items (bijv. “React:” en “Typescript:”) voeg een dubbele punt toe na “Typescript + React”:

-- Typescript + React [react-query-builder]...
+- Typescript + React: [react-query-builder]...
src/Filters/FiltersPartial.php (1)

77-77: Correctie voor PostgreSQL LIKE queries escape karakter.

De wijziging verwijdert PostgreSQL uit de lijst van databases die een expliciet escape karakter nodig hebben. Dit is een goede aanpassing omdat PostgreSQL anders omgaat met LIKE escaping dan SQLite en SQL Server.

Het PHPDoc-commentaar op regel 72 vermeldt nog steeds 'pgsql' als een van de mogelijke drivertypen en bevat een typefout ('sqlsrc' in plaats van 'sqlsrv'). Het zou goed zijn om deze documentatie bij te werken zodat deze overeenkomt met de implementatie:

- * @param 'sqlite'|'pgsql'|'sqlsrc'|'mysql' $driver
+ * @param 'sqlite'|'sqlsrv'|'mysql'|string $driver
CHANGELOG.md (1)

105-105: Kleine typografische kwestie.

De term "php markdown" zou correct geschreven moeten worden als "PHP Markdown" (met hoofdletters).

-* Update Documentation for php markdown by @chengkangzai in https://github.com/spatie/laravel-query-builder/pull/969
+* Update Documentation for PHP Markdown by @chengkangzai in https://github.com/spatie/laravel-query-builder/pull/969
🧰 Tools
🪛 LanguageTool

[grammar] ~105-~105: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...pull/961 * Update Documentation for php markdown by @chengkangzai in https://github.com/...

(MARKDOWN_NNP)

.github/workflows/run-tests.yml (1)

72-72: Mogelijke type-inconsistentie in de job.services.mysql.ports expressie

Er is een potentiële type-mismatch in de toegang tot job.services.mysql.ports[3306]. ActionLint verwacht een string maar krijgt een nummer.

Het is aan te raden om dit formaat te controleren, hoewel dit vaak correct werkt in GitHub Actions. Als je problemen ondervindt, kun je overwegen dit naar een string te converteren of een andere syntax te gebruiken.

🧰 Tools
🪛 actionlint (1.7.4)

72-72: property access of object must be type of string but got "number"

(expression)

docs/features/filtering.md (2)

223-223: Ontbrekende komma in tekst

In de zin "When passing an array as a parameter you can access it, as an array, in the scope..." ontbreekt mogelijk een komma na "parameter".

-When passing an array as a parameter you can access it, as an array, in the scope by using the spread operator.
+When passing an array as a parameter, you can access it, as an array, in the scope by using the spread operator.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~223-~223: Possible missing comma found.
Context: ...8-12-31 ``` When passing an array as a parameter you can access it, as an array, in the ...

(AI_HYDRA_LEO_MISSING_COMMA)


242-246: Kleine spelfout in uitleg over route model binding

Er staat "Remeber" in plaats van "Remember" in de tekst over route model binding.

-If you use any other column aside `id` column for route model binding (ULID,UUID). Remeber to specify the value of the column used in route model binding
+If you use any other column aside `id` column for route model binding (ULID,UUID). Remember to specify the value of the column used in route model binding
config/query-builder.php (2)

64-73: Onthoud consistent documentatie en type-consistentie voor nieuwe config-optie

De PHP-doc beschrijft dat de sleutel één van snake_case, camelCase of none verwacht, maar de default-waarde is false (boolean).
Dit leidt tot twee potentiële valkuilen:

  1. Type-inconsistentie → down-stream code moet nu zowel booleans als strings afhandelen.
  2. De inleidende paragraaf is grotendeels gekopieerd uit de vorige blokken en refereert nog steeds aan “snake case plural” i.p.v. tabelnamen, waardoor de bedoeling niet 100 % duidelijk is.

Overweeg daarom:

-    'convert_relation_table_name_strategy' => false,
+    // Mogelijke waarden: 'snake_case', 'camelCase', 'none'.
+    // Gebruik 'none' (of null) om de functionaliteit uit te schakelen,
+    // zodat het type altijd string|null i.p.v. bool|string is.
+    'convert_relation_table_name_strategy' => 'none',

en herschrijf de commentaar-regels zodat ze expliciet gaan over “relation table names” i.p.v. relation-namen.


75-81: Kruisverwijzing met eerder blok zou nuttig zijn

Je introduceert nu ook convert_field_names_to_snake_case. Een korte verwijzing naar het feit dat dit werkt in combinatie met de zojuist toegevoegde tabel-naam-strategie helpt toekomstige maintainers om de samenhang sneller te zien.

tests/FieldsTest.php (2)

86-99: Config-wijzigingen resetten om test-interferentie te voorkomen

Deze test zet runtime-config op:

config(['query-builder.convert_field_names_to_snake_case' => true]);
config(['query-builder.convert_relation_table_name_strategy' => 'camelCase']);

Laravel/Pest herstelt config niet automatisch tussen tests wanneer de applicatie niet telkens wordt herstart. Voeg daarom een teardown/reset toe of gebruik Config::set binnen een refreshApplication()-context om neven­effecten op volgende tests te vermijden.


218-238: Assert op volledige SELECT-string is fragiel

Deze verwachtingen vergelijken de ruwe SQL tot op spaties en alias-namen:

$this->assertQueryLogContains('select `related_through_pivot_models`.`id`, …');

Kleine veranderingen in Laravel-versie, database-driver of query-optimizer kunnen de volgorde van kolommen, back-ticks of spaties wijzigen, waardoor de test onverwacht faalt.

Alternatief: parseer de query of gebruik meer tolerante asserts, b.v. assertStringContainsString('from related_through_pivot_models') gecombineerd met asserts op aanwezigheid van de belangrijkste kolomnamen.

tests/FilterTest.php (2)

36-48: Instellen van custom query-parameter zonder herstel kan tot lekken leiden

De test wijzigt de configuratie-parameter:

config(['query-builder.parameters.filter' => 'custom_filter']);

Zonder reset blijft deze waarde mogelijk actief voor volgende tests, wat onbedoelde falers kan opleveren. Overweeg gebruik van:

$this->beforeApplicationDestroyed(fn () => config()->offsetUnset('query-builder.parameters.filter'));

of gebruik Laravel’s refreshApplication() helper.


785-896: Operator-filter-tests missen negatieve controles

De nieuwe operator-tests verifiëren alleen dat een query wel resultaten oplevert. Het zou de robuustheid verhogen om ook het spiegelbeeld te testen (bijv. voor GREATER_THAN controleren dat een kleiner salaris niét wordt teruggegeven). Zo voorkom je dat een foutieve implementatie die altijd alle records retourneert toch groen door de tests komt.

src/Concerns/AddsFieldsToQuery.php (1)

43-50: Strategiekeuze ‘none’ ontbreekt in de conversielogica
De convert_relation_table_name_strategy-config accepteert volgens de nieuwe documentatie ook de waarde 'none', maar alleen de varianten 'camelCase' en 'snake_case' worden hier afgevangen. Dit kan leiden tot onverwachte resultaten als een ontwikkelaar expliciet 'none' instelt – de waarde wordt dan genegeerd in plaats van dat het model-tabelnaam ongewijzigd blijft.

-if (config('query-builder.convert_relation_table_name_strategy', false) === 'camelCase') {
+switch (config('query-builder.convert_relation_table_name_strategy', false)) {
+    case 'camelCase':
         $modelTableName = Str::camel($modelTableName);
-}
-
-if (config('query-builder.convert_relation_table_name_strategy', false) === 'snake_case') {
+        break;
+    case 'snake_case':
         $modelTableName = Str::snake($modelTableName);
-}
+        break;
+    // 'none' of ongeldige waarden laten het origineel ongemoeid
+}
src/Filters/FiltersBelongsTo.php (2)

56-66: Type-hints verruimen of exception-pad vereenvoudigen
getRelatedModelFromRelation() geeft in de header ?Model terug, maar kan in praktijk nooit null retourneren; bij een ongeldige relatie wordt direct een RelationNotFoundException gegooid. Dit type-verschil kan verwarring wekken in IDE’s. Overweeg om de return-type naar Model te veranderen óf een expliciete return null-pad toe te voegen.


68-82: Overbodige parameter $level maakt code onnodig complex
De recursieve helper getModelFromRelation() accepteert $level, maar deze variabele wordt nergens gebruikt. Dit suggereert een resterend artefact van een eerdere implementatie. Het is beter om ongebruikt argumentatie te verwijderen om leesbaarheid te vergroten.

-protected function getModelFromRelation(Model $model, string $relation, int $level = 0): ?Model
+protected function getModelFromRelation(Model $model, string $relation): ?Model
@@
-    return $this->getModelFromRelation($firstRelatedModel, implode('.', array_slice($relationParts, 1)), $level + 1);
+    return $this->getModelFromRelation($firstRelatedModel, implode('.', array_slice($relationParts, 1)));
src/AllowedFilter.php (1)

86-92: Parameter-volgorde wijkt af van bestaande patronen
De nieuwe belongsTo()-methode plaatst $internalName vóór $arrayValueDelimiter, terwijl andere factory-methodes eerst de delimiter accepteren. Dit kan voor verwarring zorgen bij gebruikers die middels IDE-auto-complete parameters kopiëren. Overweeg een uniforme signatuur door $arrayValueDelimiter consequent als voorlaatste argument te zetten.

src/Filters/FiltersOperator.php (1)

31-38: Mogelijke scope-issue in closure bij array-filters

Binnen de closure wordt variabele $value uit de outer-scope meegegeven terwijl dezelfde naam binnen de foreach wordt overschreven door $item. Dit kan tot verwarring leiden; enkel $property hoeft worden ge-captured.

-    $query->where(function ($query) use ($value, $property) {
+    $query->where(function ($query) use ($property) {
         foreach ($value as $item) {
             $this->__invoke($query, $item, $property);
         }
     });
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 55aa90b and 6b5bf0c.

📒 Files selected for processing (35)
  • .gitattributes (1 hunks)
  • .github/workflows/dependabot-auto-merge.yml (1 hunks)
  • .github/workflows/run-tests.yml (1 hunks)
  • .gitignore (1 hunks)
  • .phpunit.cache/test-results (0 hunks)
  • CHANGELOG.md (1 hunks)
  • README.md (1 hunks)
  • composer.json (1 hunks)
  • config/query-builder.php (1 hunks)
  • database/factories/AppendModelFactory.php (1 hunks)
  • database/factories/TestModelFactory.php (0 hunks)
  • docs/_index.md (1 hunks)
  • docs/advanced-usage/front-end-implementation.md (2 hunks)
  • docs/features/filtering.md (4 hunks)
  • docs/features/selecting-fields.md (2 hunks)
  • docs/introduction.md (4 hunks)
  • phpstan.neon.dist (1 hunks)
  • src/AllowedField.php (2 hunks)
  • src/AllowedFilter.php (5 hunks)
  • src/Concerns/AddsFieldsToQuery.php (2 hunks)
  • src/Enums/FilterOperator.php (1 hunks)
  • src/Filters/FiltersBelongsTo.php (1 hunks)
  • src/Filters/FiltersExact.php (1 hunks)
  • src/Filters/FiltersOperator.php (1 hunks)
  • src/Filters/FiltersPartial.php (1 hunks)
  • src/Filters/FiltersScope.php (1 hunks)
  • src/Includes/IncludedCount.php (1 hunks)
  • src/Includes/IncludedRelationship.php (2 hunks)
  • src/QueryBuilder.php (2 hunks)
  • tests/FieldsTest.php (5 hunks)
  • tests/FilterTest.php (30 hunks)
  • tests/RelationFilterTest.php (2 hunks)
  • tests/SortTest.php (0 hunks)
  • tests/TestCase.php (3 hunks)
  • tests/TestClasses/Models/TestModel.php (2 hunks)
💤 Files with no reviewable changes (3)
  • database/factories/TestModelFactory.php
  • tests/SortTest.php
  • .phpunit.cache/test-results
🧰 Additional context used
🧬 Code Graph Analysis (5)
database/factories/AppendModelFactory.php (1)
tests/TestClasses/Models/AppendModel.php (1)
  • AppendModel (8-25)
tests/RelationFilterTest.php (2)
tests/Pest.php (1)
  • createQueryFromFilterRequest (11-20)
src/AllowedFilter.php (2)
  • AllowedFilter (18-207)
  • operator (119-124)
src/Includes/IncludedCount.php (1)
src/AllowedInclude.php (1)
  • count (58-63)
src/Filters/FiltersBelongsTo.php (3)
src/Filters/FiltersPartial.php (1)
  • __invoke (14-44)
src/Filters/FiltersExact.php (1)
  • __invoke (23-40)
src/Filters/FiltersScope.php (1)
  • __invoke (23-44)
tests/TestClasses/Models/TestModel.php (2)
tests/TestClasses/Models/RelatedModel.php (2)
  • nestedRelatedModels (21-24)
  • RelatedModel (10-30)
tests/TestClasses/Models/NestedRelatedModel.php (1)
  • NestedRelatedModel (8-18)
🪛 LanguageTool
docs/introduction.md

[typographical] ~26-~26: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...`` [Read more about filtering features like: partial filters, exact filters, scope f...

(RP_COLON)


[uncategorized] ~38-~38: This verb may not be in the correct form. Consider using a different form for this context.
Context: ...ir posts loaded ``` [Read more about include features like: including nested relatio...

(AI_EN_LECTOR_REPLACEMENT_VERB_FORM)


[typographical] ~50-~50: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ... ``` [Read more about sorting features like: custom sorts, sort direction, ...](http...

(RP_COLON)

docs/features/filtering.md

[uncategorized] ~223-~223: Possible missing comma found.
Context: ...8-12-31 ``` When passing an array as a parameter you can access it, as an array, in the ...

(AI_HYDRA_LEO_MISSING_COMMA)

CHANGELOG.md

[grammar] ~105-~105: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...pull/961 * Update Documentation for php markdown by @chengkangzai in https://github.com/...

(MARKDOWN_NNP)

🪛 actionlint (1.7.4)
.github/workflows/run-tests.yml

72-72: property access of object must be type of string but got "number"

(expression)

🔇 Additional comments (35)
database/factories/AppendModelFactory.php (1)

5-6: Imports geordend volgens conventies
De Laravel-core import (Factory) staat nu vóór de project-specifieke AppendModel import, conform de standaard import-groepering in dit project.

.gitignore (1)

6-6: Goedkeuring: negeer PHPUnit-cache
Deze wijziging voegt .phpunit.cache toe aan .gitignore, waardoor de PHPUnit-cache niet in versiebeheer wordt opgenomen en de repository schoon blijft.

.gitattributes (2)

7-7: Goedkeuring: export-ignoreren van .github map
Voegt /.github toe aan export-ignore, zodat CI-workflowconfiguraties niet in distributiepakketten terechtkomen.


12-12: Goedkeuring: export-ignoreren van .php_cs.dist.php
Voegt .php_cs.dist.php toe aan export-ignore, waardoor dit configuratiebestand niet in distributiepakketten wordt opgenomen.

README.md (1)

1-16: Bevestig dat de introductietekst bewust is verwijderd
De oorspronkelijke beschrijvende paragraaf onder de kop is weggehaald. Dit kan de eerste indruk en context voor nieuwe gebruikers verminderen. Bevestig of dit intentional is of overweeg een beknopte toelichting opnieuw toe te voegen.

docs/_index.md (1)

2-2: Documentatieversie correct bijgewerkt.

De titel is bijgewerkt van "v5" naar "v6", wat consistent is met de versie-update van het pakket.

.github/workflows/dependabot-auto-merge.yml (1)

16-16: Goede update van de dependabot metadata actie.

De update van dependabot/fetch-metadata van v2.1.0 naar v2.4.0 zorgt voor verbeterde functionaliteit en beveiliging bij het automatisch samenvoegen van afhankelijkheidsupdates.

composer.json (2)

24-26: Laravel 12.0 ondersteuning toegevoegd.

Prima aanpassing om ondersteuning toe te voegen voor Laravel 12.0 naast de bestaande ondersteuning voor 10.0 en 11.0.


33-35: Dev-afhankelijkheden bijgewerkt.

Goede updates van test-gerelateerde afhankelijkheden om compatibiliteit met nieuwere versies te garanderen:

  • orchestra/testbench ondersteunt nu ook versie 10.0
  • pestphp/pest ondersteunt nu versie 3.7
  • phpunit/phpunit ondersteunt nu versie 11.5.3

Let op: nunomaduro/larastan is verwijderd uit de require-dev sectie, wat overeenkomt met de wijziging in het phpstan.neon.dist bestand.

phpstan.neon.dist (1)

2-2: Larastan pad bijgewerkt.

Het pad naar de Larastan extensie is bijgewerkt van ./vendor/nunomaduro/larastan/extension.neon naar ./vendor/larastan/larastan/extension.neon, wat overeenkomt met de verwijdering van het nunomaduro/larastan pakket uit composer.json.

src/Enums/FilterOperator.php (1)

5-13: Nieuwe enum-gevallen correct gedefinieerd
De FilterOperator enum bevat alle vereiste operatoren (leeg teken, =, <>, <, >, <=, >=), wat zorgt voor een typeveilige representatie in de query builder.

docs/advanced-usage/front-end-implementation.md (1)

3-3: Controleer navigatievolgorde
De weight is verhoogd van 3 naar 6; bevestig dat dit de gewenste plaatsing in de documentatie-navigatie oplevert.

docs/features/selecting-fields.md (2)

12-18: Voorbeeldcode verduidelijkt met PHP-block
Mooi dat je de GET-aanroep als commentaar en de PHP-syntaxmarkering hebt toegevoegd; dit verhoogt de duidelijkheid voor ontwikkelaars.


54-54: Klikbare issue-link is nuttig
De conversie van #175 naar een Markdown-link verbetert de navigatie naar het bijbehorende GitHub-issue.

src/Filters/FiltersExact.php (1)

69-73: Correcte variabelevolgorde in use-statement
Het omdraaien van $property en $value in de use-clausule heeft geen functionele impact, maar verbetert de leesbaarheid door consistentie met de closure-parameters.

tests/TestCase.php (3)

40-41: Goede toevoeging van testkolommen voor nieuwe filterfunctionaliteit.

Deze nieuwe kolommen (full_name en salary) ondersteunen de nieuwe filtermogelijkheden die in deze PR worden geïntroduceerd. Het nullable maken van deze velden biedt flexibiliteit bij het testen.


66-66: Consistente kolom toevoeging voor gerelateerde modellen.

De toevoeging van de full_name kolom aan de gerelateerde modellen tabel is consistent met de wijzigingen in de hoofdtabel en ondersteunt het testen van relatie-gebaseerde filters.


97-97: Ray debugging provider uitgeschakeld.

Het uitcommentariëren van de RayServiceProvider is een logische aanpassing om onnodige dependencies tijdens het testen te verminderen.

tests/TestClasses/Models/TestModel.php (1)

11-11: Goede implementatie van HasManyThrough relatie voor geneste filters.

De toevoeging van de nestedRelatedModels relatie is een goede uitbreiding die het testen van de nieuwe filterfunctionaliteit voor geneste relaties mogelijk maakt. De relatie is duidelijk gedefinieerd met expliciete foreign en local keys, wat een best practice is.

Also applies to: 31-41

src/AllowedField.php (1)

6-6: Uitstekende toevoeging van snake_case conversie voor veldnamen.

De wijziging voegt ondersteuning toe voor het optioneel converteren van veldnamen naar snake_case, wat goed aansluit bij de configuratieopties voor naamgevingsconventies die in deze PR worden geïntroduceerd. De implementatie is netjes en maakt gebruik van Laravel's Str::snake() helper.

De standaardwaarde false zorgt voor backward compatibility met bestaande code, wat een goede ontwikkelpraktijk is.

Also applies to: 40-46

tests/RelationFilterTest.php (2)

4-4: Goede toevoeging voor de nieuwe operator filter functionaliteit.

De import van FilterOperator enum is correct toegevoegd om de nieuwe operator filters in de test te kunnen gebruiken.


120-130: De test dekt de nieuwe operator filter functionaliteit goed af.

De test volgt hetzelfde patroon als de bestaande tests voor exact en partial filtering, en test specifiek het gedrag van operator filtering wanneer $addRelationConstraint op false staat. De SQL controle verzekert dat de query correct wordt gegenereerd.

src/Filters/FiltersScope.php (2)

57-57: Verbeterde syntax met PHP 8 nullsafe operator.

De wijziging van optional()->isSubclassOf() naar nullsafe operator ?-> is een goede modernisering van de code die gebruik maakt van nieuwe PHP 8 features.


62-62: Onnodige nullsafe check verwijderd.

De directe instantiëring van het model zonder nullsafe operator is correct omdat op dit punt in de code $this->getClass($parameter) gegarandeerd niet null is (gezien de vorige check op regel 57).

CHANGELOG.md (1)

5-115: Complete en gedetailleerde changelog updates.

De changelog is bijgewerkt met alle nieuwe functionaliteiten en fixes voor versies 6.1.0 t/m 6.3.2, inclusief:

  • Generics support voor betere type inference
  • Laravel 12.x compatibiliteit
  • Nieuwe "belongs to" filters
  • Operator-gebaseerde filters
  • Configuratieopties voor naamgevingsconventies
  • Diverse bugfixes en documentatie-updates

Alle entries volgen het standaard formaat met datums, wijzigingen, contributors en links naar volledige changelogs.

🧰 Tools
🪛 LanguageTool

[grammar] ~105-~105: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...pull/961 * Update Documentation for php markdown by @chengkangzai in https://github.com/...

(MARKDOWN_NNP)

src/QueryBuilder.php (2)

17-18: Goede toevoeging van generieke type-annotaties

De template-annotatie @template TModel of Model en de bijbehorende @mixin EloquentBuilder<TModel> zorgen voor betere type-inferentie en ondersteuning in IDEs. Dit verbetert de statische analyse zonder runtime-gedrag te wijzigen.


61-64: Uitstekende verbetering van type-veiligheid

Het toevoegen van de PHPDoc-annotatie en het gebruik van een variabele om de query builder vast te leggen zorgt ervoor dat de generieke type-informatie behouden blijft in de return waarde. Dit verbetert IDE-ondersteuning en statische analyse tools kunnen hiermee beter typen infereren.

.github/workflows/run-tests.yml (2)

3-4: Vereenvoudigde trigger-conditie

De configuratie is vereenvoudigd door op elke push de tests uit te voeren, in plaats van specifieke bestandspaden te filteren.


16-25: Goede uitbreiding van test matrix

De ondersteuning voor PHP 8.4 en Laravel 12.* is toegevoegd aan de testmatrix, samen met de bijbehorende testbench versies. Dit zorgt voor betere compatibiliteit en toekomstbestendigheid.

src/Includes/IncludedRelationship.php (3)

25-39: Goede implementatie van dynamische tabel naam resolutie

De code implementeert een configureerbare strategie voor het omzetten van relatienamen naar tabelnamen. De try-catch structuur zorgt ervoor dat fouten bij het ophalen van gerelateerde modellen geen problemen veroorzaken.


40-40: Verbeterde flexibiliteit bij het doorgeven van tabelnamen

De functie getRequestedFieldsForRelatedTable is aangepast om een optionele tabelnaam parameter te accepteren, wat meer flexibiliteit biedt in naamconventies.


48-48: Beter kwalificeren van kolommen

Het gebruik van $query->qualifyColumns($fields) zorgt ervoor dat kolommen correct worden gekwalificeerd met tabelnamen, wat SQL-fouten voorkomt bij complexe queries met meerdere tabellen.

docs/features/filtering.md (2)

89-121: Uitstekende documentatie voor operator filters

De nieuwe sectie over operator filters is duidelijk en goed gestructureerd. De voorbeelden tonen zowel statische operator filters (zoals GREATER_THAN) als dynamische operator filters, wat gebruikers helpt bij het implementeren van deze functionaliteit.


137-184: Duidelijke documentatie voor BelongsTo filters

De sectie over BelongsTo filters bevat goede voorbeelden, inclusief basisgebruik, aliassen en geneste relaties. De code-voorbeelden zijn helder en demonstreren goed hoe deze filters in verschillende scenario's gebruikt kunnen worden.

tests/FilterTest.php (1)

125-152: Driver-specifieke ESCAPE-assert kan fout-positieven opleveren

De test verwacht geen ESCAPE '\' voor MySQL/MariaDB/pgsql:

$query->not->toContain("ESCAPE '\\'")

Maar sommige versies/instellingen (e.g. ANSI_QUOTES) kunnen tóch een escape toevoegen. Overweeg om de assert te beperken tot het voorkomen van dubbele escapes of gebruik van regex die tolerant is voor driver-variaties.

@ruuddeenen
Copy link
Author

@coderabbitai resolve

@coderabbitai
Copy link

coderabbitai bot commented May 15, 2025

✅ Actions performed

Comments resolved and changes approved.

@kjrobin kjrobin changed the base branch from develop to v3 May 22, 2025 12:17
@kjrobin kjrobin merged commit 37807a7 into v3 May 22, 2025
3 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.